两个大整数相乘 C++ 版本 源码
2012-12-28 17:49
387 查看
看到了这个题目,就突然要写了,完全徒手写的, itoa_m 数字转换成字符串 是拷贝过来的,也是我积累的源码。
这个大整数 主要思想就是按照我们小学学习的 乘法 笔算方法,先单个 乘积,再相加,具体不说了,你应该明白的。
这个主要难点就是 字符串转数字 和数字转字符串 以及字符转相加。
由于我是用了std::string 所以简单许多。如果改成C语言版本的,还要做许多工作。
程序包括了我临时写的 两个大整数相加 的函数。
可以通过 开始 运行 (Win+R) ,输入 calc 打开计算机 进行对比。不知道 有没有 Bug!
这么一个小程序,好像 费了我一个多小时,关键 就是类库的积累,有类库会很方便的。如果用C 要更长时间,因为没太多可用的类库,如果用java,拥有庞大的类库,写这个程序应该简单的不得了了吧!!
这个大整数 主要思想就是按照我们小学学习的 乘法 笔算方法,先单个 乘积,再相加,具体不说了,你应该明白的。
这个主要难点就是 字符串转数字 和数字转字符串 以及字符转相加。
由于我是用了std::string 所以简单许多。如果改成C语言版本的,还要做许多工作。
程序包括了我临时写的 两个大整数相加 的函数。
可以通过 开始 运行 (Win+R) ,输入 calc 打开计算机 进行对比。不知道 有没有 Bug!
这么一个小程序,好像 费了我一个多小时,关键 就是类库的积累,有类库会很方便的。如果用C 要更长时间,因为没太多可用的类库,如果用java,拥有庞大的类库,写这个程序应该简单的不得了了吧!!
http://hero.pongo.cn/Question/Details?ID=6&ExamID=6
/* 两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。 */ #include<string> #include<iostream> #include<stdio.h> using namespace std; string strPlusAsNum(string str1,string str2); string ZeroNum(int num){ string result=""; for(int i=0;i<num;i++){ result+="0"; } return result; } char * itoa_m(int n){ char* arrBuff=NULL; int radix=10; char tmp[33]; char* tp = tmp; int i; unsigned v; int sign; char* sp; if (radix > 36 || radix <= 1) { // __set_errno(EDOM); //return 0; radix=10; } sign = (radix == 10 && n < 0); if (sign) v = -n; else v = (unsigned)n; while (v || tp == tmp) { i = v % radix; v = v / radix; if (i < 10) *tp++ = i+'0'; else *tp++ = i + 'a' - 10; } if (arrBuff == 0){ arrBuff=(char*)malloc((tp-tmp)+sign+1); } sp = arrBuff; if (sign) *sp++ = '-'; while (tp > tmp) *sp++ = *--tp; *sp = 0; return arrBuff; } int main(){ // string str1="2345678900987766554411223301",str2="346587436598437594375943875943875"; string str1="1234",str2="1234"; cout<<"============"<<endl; cout<<"Biginteger 相乘运算"<<endl; cout<<"============"<<endl; cout<<"输入Num1="; cin>>str1; cout<<"输入Num2="; cin>>str2; string result; int wei1=strlen(str1.data()); int wei2=strlen(str2.data()); string * calcOneBit=new string[wei2]; for(int i=0;i<wei2;i++){ calcOneBit[i]+=str2.data()[wei2-i-1]; int n1=atoi(calcOneBit[i].data()); calcOneBit[i]="";//清空 int str1_jinwei=0; string temp; for(int j=0;j<wei1;j++){ //进行一位与str1的计算结果 保存到calcOneBit[i]中 temp=str1.data()[wei1-j-1]; int n2=atoi(temp.data()); int n=n1*n2; n+=str1_jinwei; if(n>=10){ str1_jinwei=n/10; n=n%10; }else{ str1_jinwei=0; } temp=calcOneBit[i]; char *ccc=itoa_m(n); calcOneBit[i]=ccc; free(ccc); calcOneBit[i]+=temp; cout<<"calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl; } if(str1_jinwei>0){ temp=calcOneBit[i]; char * cc=itoa_m(str1_jinwei); calcOneBit[i]=cc;free(cc); calcOneBit[i]+=temp; cout<<"&& calcOneBit["<<i<<"]="<<calcOneBit[i].data()<<endl; } } for(int i=0;i<wei2;i++){ if(i>0) calcOneBit[i]+=ZeroNum(i); cout<<" "<<i<<" "<< calcOneBit[i].data()<<endl; } result=calcOneBit[0]; for(int i=0;i < wei1 - 1;i++){ result=strPlusAsNum(result,calcOneBit[i+1]); } cout<<"========================"<<endl; cout<<""<<str1.data()<<" * "<<str2.data()<<" = "<<result.data()<<endl; cout<<"========================"<<endl; return 0; } string strPlusAsNum(string str1,string str2){ int size1=strlen(str1.data()); int size2=strlen(str2.data()); int size=size1>size2 ? size1 : size2; int jinwei=0; string result="",temp=""; for(int i=0;i<size;i++){ int n1,n2,n; //n1 if(i<size1){ string temp2;temp2=str1.data()[size1-i-1]; n1=atoi(temp2.data()); }else{ n1=0; } //n2 if(i<size2){ string temp2;temp2=str2.data()[size2-i-1]; n2=atoi(temp2.data()); }else{ n2=0; } //Plus n n=n1+n2;n+=jinwei; if(n>=10){ jinwei=n/10; n=n%10; }else{ jinwei=0; } //n to string char * cc=itoa_m(n); temp=result; result=cc;free(cc); result+=temp; } if(jinwei>0){ temp=result; char * cc=itoa_m(jinwei); result=cc;free(cc); result+=temp; } return result; }
相关文章推荐
- C++中两个大整数相乘
- C/C++ 判断两个整数相乘是否溢出
- 两个任意长度的长整数相乘(华为oj,C++)
- GVF snake C++源码 两个版本
- C++ 算法之 输入两个整数m n,求计算需要改变m的二进制表示中的多少位才能得到n
- 帮我把这个改一下~写个正确的~谢谢 用C++求两个整数的最大值 谁来告诉我这个程序错在哪儿啦
- C++中实现求两个整数的最大公约数和最小公倍数
- 【C/C++】计算两个整数的最大公约数和最小公倍数
- C++、MATLAB 两个数值相除,取结果的余数、整除数部分 MATLAB两整数相除结果为整型、浮点型
- 检测两个整数相乘是否会产生溢出
- C++输入两个数,输出两个数之间的整数
- [转]C++指针加整数、两个指针相减的问题
- 一个简单的C++程序:输入两个整数,通过调用函数求两个数中的较大值
- 求两个大整数相乘的结果 不能使用BigInteger和long
- (c++)输入两个正整数m和n,求其最大公约数和最小公倍数。
- 大整数相乘(未突破计算机位数限制)的int版本
- 两个大整数相乘(某公司校园招聘机试试题)
- c++实现两个矩阵相乘
- 求两个整数的最小公倍数和最大公约数的算法及其C++实现
- C++求两个整数的最大公约数和最小公倍数