算法——大整数乘法
2017-07-04 16:19
155 查看
C++语言实现大整数乘法
list<char> long_sub(list<char> a,list<char>b); list<char> long_add(list<char> a,list<char>b) { list<char> c; if(*(a.begin())=='-' && *(b.begin())!='-') { a.erase(a.begin());//去掉符号位 c=long_sub(b,a); return c; } if(*(a.begin())!='-' && *(b.begin())=='-') { b.erase(b.begin());//去掉符号位 c=long_sub(a,b); return c; } if(*(a.begin())=='-' && *(b.begin())=='-') { a.erase(a.begin());//去掉符号位 b.erase(b.begin()); c=long_sub(a,b); c.push_front('-'); return c; } if(*(a.begin())!='-' && *(b.begin())!='-') {//保证两个数字位数同样 int len1=a.size();int len2=b.size(); if(len1<len2) for(int i=0;i<len2-len1;i++) a.push_front('0'); else if(len1>len2) for(int i=0;i<len1-len2;i++) b.push_front('0'); //两个位数同样的正整数相加; int carry=0;//进位 int num; list<char>::iterator iter1=a.end(); iter1--; list<char>::iterator iter2=b.end(); iter2--; for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--) { int num1=*iter1-'0';int num2=*iter2-'0'; num=(num1+num2+carry)%10; carry=(num1+num2+carry)/10; c.push_front(num+'0'); } //最高位相加的处理 int num1=*iter1-'0';int num2=*iter2-'0'; num=(num1+num2+carry)%10; carry=(num1+num2+carry)/10; c.push_front(num+'0'); if(carry!=0) c.push_front('0'); return c; } return c; } list<char> long_sub(list<char> a,list<char>b) {//a-b list<char> c; if(*(a.begin())!='-' && *(b.begin())=='-') { b.erase(b.begin());//去掉符号位 c=long_add(a,b); return c; } if(*(a.begin())=='-' && *(b.begin())!='-') { a.erase(a.begin()); c=long_add(a,b); c.push_front('-'); return c; } if(*(a.begin())=='-'&&*(b.begin())=='-') { a.erase(a.begin());b.erase(b.begin()); c=long_sub(b,a); return c; } if(*(a.begin())!='-' && *(b.begin())!='-') { int sign=-1;//结果的正负 int len1=a.size(); int len2=b.size(); if(len1<len2) { sign='-'; for(int i=0;i<len2-len1;i++) a.push_front('0'); } else if(len1>len2) for(int i=0;i<len1-len2;i++) b.push_front('0'); else if(*(a.begin())<*(b.begin())) sign='-'; int cc=0;//借位 int num; list<char>::iterator iter1=a.end(); iter1--; list<char>::iterator iter2=b.end(); iter2--; if(sign!='-') { for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--) { int num1=*iter1-'0';int num2=*iter2-'0'; int c_new=0; if(num1-cc<num2) { c_new=1; num1=num1+10; } num=(num1-num2-cc)%10; cc=c_new; c.push_front(num+'0'); } //最高位的处理 int num1=*iter1-'0'; int num2=*iter2-'0'; num=(num1-num2-cc)%10; if(num!=0) c.push_front(num+'0'); } else if(sign='-') { for(;iter1!=a.begin() && iter2!=b.begin();iter1--,iter2--) { int num1=*iter1-'0'; int num2=*iter2-'0'; int c_new=0; if(num2-cc<num1) { c_new=1; num2=num2+10; } num=(num2-num1-cc)%10; cc=c_new; c.push_front(num+'0'); } //最高位的处理 int num1=*iter1-'0'; int num2=*iter2-'0'; num=(num2-num1-cc)%10; if(num!=0) c.push_front(num+'0'); c.push_front('-'); } return c; } return c; } void MultiPly()//大整数乘法; {//循环法计算,float类型正负号问题都能够间接转换成正整数相乘问题。 char s1[1000],s2[1000]; cout<<"输入两个大整数"<<endl; cin>>s1>>s2; int i=0,j=0; bool flag=false; int len1=strlen(s1); int len2=strlen(s2); int len=len1*len2+1; int *a=new int [len1]; int *b=new int [len2]; int *c=new int [len]; for( i=0;i<len;i++) *(c+i)=0; for(i=0;i<len1;i++) *(a+i)=*(s1+len1-1-i)-'0'; for(i=0;i<len2;i++) *(b+i)=s2[len2-1-i]-'0'; for(i=0;i<len1;i++) for(j=0;j<len2;j++) c[i+j]+=a[i]*b[j]; for(i=0;i<len;i++) { if(c[i]>9) { c[i+1]+=c[i]/10; c[i]%=10; } } cout<<"两个大数相乘结果例如以下:"<<endl; for(i=len-1;i>=0;i--) { if(flag) cout<<c[i]; else { if(c[i]!=0) { cout<<c[i];flag=true;} } } delete[]a;delete[]b;delete[]c; }
相关文章推荐
- 大整数的乘法——比较好的算法! (转…
- 【算法】 大整数乘法
- 大整数算法[11] Karatsuba乘法
- 算法之大整数乘法
- 从大整数乘法的实现到 Karatsuba 快速算法
- 算法之大整数乘法
- 算法——大整数乘法
- 大整数乘法---FFT算法
- 算法学习-分治法-大整数乘法
- 算法——大整数乘法
- 【老鸟学算法】大整数乘法——算法思想及java实现
- 贪心算法-大整数乘法/加法/减法
- 大整数的乘法——比较好的算法!
- 算法实现(5)大整数乘法
- 算法之大整数乘法
- 算法06:大整数乘法分治算法——分治法Part2
- 大整数乘法算法简单实现 java
- 算法系列:大整数的乘法
- 算法之【大整数乘法】
- 大整数乘法——算法思想及java实现