有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入:空格分隔的两个字符串,代表输入的两个大整数
输出:输入的乘积,用字符串表示
用例:
输入:
72106547548473106236 982161082972751393
输出:
70820244829634538040848656466105986748
/***********************大整数相乘****************************************/
s1 15 res:保留累加结果的数组
* s2 99 cur:保留当前s2乘出来结果的数组
---------- -----------
cur(res) 135 C:进位
+ cur 135 N:余数
---------- -----------
res 1485
/***********************************************************************/
string multiply(string num1, string num2) {
if(num1.size()==1&&num1[0] == '0'||num2.size() == 1&&num2[0] == '0')
return string("0");
vector<int>s2(num2.begin(),num2.end());
vector<int>s1(num1.begin(),num1.end());
for(auto &x:s2)x -= 48;
for(auto &x:s1)x -= 48;
vector<int>res;
int C = 0,N = 0;
int len1 = s1.size(),len2 = s2.size();
for(int i=len2-1;i>=0;--i){
vector<int>cur;
for(int j=len1-1;j>=0;--j){
N = (s1[j]*s2[i]+C)%10;
C = (s1[j]*s2[i]+C)/10;
cur.insert(cur.begin(),N);
}
if(C)cur.insert(cur.begin(),C);
C = 0;
if(i==len2-1){
res = cur;
continue;
}
int len3 = res.size(),len4 = cur.size(),resi,curi;
for(resi=len3-len2+i,curi=len4-1;resi>=0&&curi>=0;--resi,--curi){
N = (res[resi]+cur[curi]+C)%10;
C = (res[resi]+cur[curi]+C)/10;
res[resi] = N;
}
while(curi>=0){
N = (cur[curi]+C)%10;
C = (cur[curi]+C)/10;
res.insert(res.begin(),N);
--curi;
}
if(C)res.insert(res.begin(),C);
C = 0;
}
string ans;
for(auto x:res)ans.push_back(x+'0');
return ans;
}
测试程序:
int main(){
string s1,s2;
while(cin>>s1>>s2){
string ans = multiply(s1, s2);
cout<<ans<<endl;
}
return 0;
}