分治法---大整數相乘
阿新 • • 發佈:2019-02-10
題目:大數相乘,例如:a=423405293459和b=323452345234533相乘a*b。
這裡我們採用分治的思想:
1:將該問題分成b的每個數和a相乘。
2:將每個數和a相乘得到結果存入一個數組中,每個數對應一個數組。
3:合併每個陣列,相加。
#include<iostream> #include<string> using namespace std; void main() { string a="423405293459"; string b="323452345234533"; int length_a=a.length(); int length_b=b.length(); int offset=-1; char* data=new char[length_b*(length_a+length_b)];//記錄每個b的元素值乘以a的每個元素的二維陣列(可以這麼理解) memset(data,'0',length_b*(length_a+length_b)); int count; int i; int j; int flag; for(i=length_b-1;i>=0;i--) { offset++;//因為每次b乘以a的起始位置都要往左偏移一位,記錄當前應該偏移多少位 count=-1;//記錄當前乘以a元素的位置 flag=0; for(j=length_a-1;j>=0;j--) { count++; data[(length_b-1-i)*(length_a+length_b)+(length_a+length_b-1)-offset-count]=((b[i]-'0')*(a[j]-'0')+flag)%10+'0'; flag=((b[i]-'0')*(a[j]-'0')+flag)/10; } count++; data[(length_b-1-i)*(length_a+length_b)+(length_a+length_b-1)-offset-count]=flag+'0';//保證本次相乘的最後的進位也要存進去 for(int m=0;m<length_a+length_b;m++) cout<<data[(length_b-1-i)*(length_a+length_b)+m]<<" ";//測試用的,方便我們觀察 cout<<endl; } char* temp=new char[length_a+length_b+1]; temp[length_a+length_b]=0; memset(temp,'0',length_a+length_b); int index=length_a+length_b-1; flag=0; int num; for(i=(length_a+length_b-1);i>=0;i--) { num=0; for(j=0;j<length_b;j++) { num+=(data[j*(length_a+length_b)+i]-'0'); } num+=flag; temp[index--]=num%10+'0'; flag=num/10; } char* result=temp; while(*result=='0') result++; cout<<result<<endl; }