大数计算(加减乘除)
大数乘法
string solve(string, string)
设置中间进位变量c和累加变量d(从上到下考虑,不用存储中间变量)
1 string multiply(string num1, string num2) { 2 int len1 = num1.size(); 3 int len2 = num2.size(); 4 int c = 0; 5 string tmp(len1+len2,'0'); 6 for(int i=len2-1;i>=0;i--) 7 { 8 int b = num2[i]-'0'; 9 for(int j=len1-1;j>=0;j--) 10 { 11 int a = num1[j]-'0'; 12 int d = tmp[i+j+1]-'0'; 13 int x = a*b+d+c; 14 tmp[i+j+1] = x%10 +'0'; 15 c = x/10; 16 } 17 if(c) 18 { 19 tmp[i] = c+'0'; 20 c=0; 21 } 22 } 23 int k=0; 24 for(;tmp[k]=='0'&&k<tmp.size();k++); 25 if(k==tmp.size())return "0"; 26 else return tmp.substr(k); 27 }
一般写法 乘法的结果放到i+j的位置上即可
1 string multiply(string num1, string num2) { 2 string ans=""; 3 int first=0; 4 int res[300]={}; 5 int len1=num1.size(); 6 int len2=num2.size(); 7 if(len1<len2)return multiply(num2,num1); 8 int a[120]={}; 9 int b[120]={}; 10 for(int i=0;i<len1;i++) 11 a[i]=num1[len1-i-1]-'0'; 12 for(int j=0;j<len2;j++) 13 b[j]=num2[len2-j-1]-'0'; 14 for(int i=0;i<len1;i++) 15 for(int j=0;j<len2;j++){ 16 res[i+j]+=a[i]*b[j]; 17 } 18 for(int i=0;i<len1+len2+2;i++){ 19 if(res[i]>=10){ 20 res[i+1]+=res[i]/10; 21 res[i]=res[i]%10; 22 } 23 } 24 for(int i=290;i>=0;i--) 25 if(res[i] != 0){ 26 first = i; 27 break; 28 } 29 for(int i=first;i>=0;i--) 30 ans += res[i]+'0'; 31 return ans; 32 33 }