两个大整数相乘 C++ 版本 源码
看到了这个题目,就突然要写了,完全徒手写的, itoa_m 数字转换成字符串 是拷贝过来的,也是我积累的源码。
这个大整数 主要思想就是按照我们小学学习的 乘法 笔算方法,先单个 乘积,再相加,具体不说了,你应该明白的。
这个主要难点就是 字符串转数字 和数字转字符串 以及字符转相加。
由于我是用了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++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。