题目:
用串的形式表示大数的乘法。
即求类似: “23234845847839461464158174814792” * “6457847285617487843234535”
要求结果返回一个串。
思路:
- 大数乘法的思路就是把一个长的数字串拆分成两个部分,子串a1和子串a2,然后结果就是a1+00…000+a2。递归的边界条件就是当每个子串的长度都小于等于4的时候,就可以通过直接*运算返回结果。
- 大数乘法中必须用到大数加法,而大数加法的思路和大数乘法也是大同小异的,将串a和串b的末尾都切出一段长度为8的子串出来,a从左到右子串分别是a1和a2,b亦然。之后就是考虑t=a2+b2的不同情况,有可能t.size<8,那么这个时候我们就要通过补0的方式凑够8位。
#include<iostream>
#include<sstream>
#include<stdlib.h>
using namespace std;
int stringtoInt(string s){
int ans=atoi(s.c_str());
return ans;
}
string inttoString(int i){
stringstream ss;
ss<<i;
string s=ss.str();
return s;
}
string add(string a,string b){
if(a.size()<=8&&b.size()<=8)
return inttoString(stringtoInt(a)+stringtoInt(b));
string a1="0";
string a2=a;
if(a.size()>8){
a1=a.substr(0,a.size()-8);
a2=a.substr(a.size()-8);
}
string b1="0";
string b2=b;
if(b.size()>8){
b1=b.substr(0,b.size()-8);
b2=b.substr(b.size()-8);
}
string t=add(a2,b2);
while(t.size()<8)t="0"+t;
if(t.size()>8)return add(add(a1,b1),"1")+t.substr(1);
return add(a1,b1)+t;
}
string zero(int n){
if(n==0){
return "";
}
if(n==1){
return "0";
}
return zero(n/2)+zero(n/2)+zero(n%2);
}
string multi(string a,string b){
if(a.size()<=4&&b.size()<=4){
return inttoString(stringtoInt(a)*stringtoInt(b));
}
if(a.size()>4){
int k=a.size()/2;
string a1=a.substr(0,k);
string a2=a.substr(k);
return add(multi(a1,b)+zero(a2.size()),multi(a2,b));
}
return multi(b,a);
}
int main(){
string s1="12345678909876543216664321666";
string s2="12345678901234567895555678955";
cout<<multi(s1,s2)<<endl;
}