题目描述
输入两个高精度非负整数M和N(M和N均小于100位)。
输入
输入两个高精度非负整数M和N(M和N均小于100位)。
输出
求这两个高精度数的积。
样例输入
36
3
样例输出
108
#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
// 超长整数*个位数
string small_mul(string s1,int c1){
if(c1==0) return "0";
else if(c1==1) return s1;
reverse(s1.begin(),s1.end());
string sum="";
// cc表示进位
int temp=0,cc=0;
for(int i=0;i<s1.length();i++){
temp=(s1[i]-'0')*c1+cc;
cc=temp/10;
sum+=temp%10+'0';
}
if(cc!=0)sum+=cc+'0';
reverse(sum.begin(),sum.end());
return sum;
}
string get_sum(string s1,string s2){
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
string sum="";
int temp=0,cc=0;
string maxstr=s1.length()>s2.length()? s1:s2;
int minlen=s1.length()>s2.length()? s2.length():s1.length();
for(int i=0;i<minlen;i++){
temp=(s1[i]-'0')+(s2[i]-'0')+cc;
cc=temp/10;
sum+=temp%10+'0';
}
// 考虑两个加数位数不同
for(int i=minlen;i<maxstr.length();i++){
temp=(maxstr[i]-'0')+cc;
cc=temp/10;
sum+=temp%10+'0';
}
// 考虑到最高位仍有进位
if(cc!=0)sum+=cc+'0';
reverse(sum.begin(),sum.end());
return sum;
}
string big_mul(string s1,string s2){
reverse(s2.begin(),s2.end());
int add=0;
string sum="",tempstr="";
for(int i=0;i<s2.length();i++){
tempstr=small_mul(s1,s2[i]-'0');
// 每加一次0,就相当于乘以10,乘法需要依次乘1,10,100,1000...
for(int k=0;k<add;k++){
tempstr+='0';
}
sum=get_sum(sum,tempstr);
add++;
}
return sum;
}
int main(){
string s1,s2;
cin>>s1>>s2;
cout<<big_mul(s1,s2)<<endl;
}
版权声明:本文为weixin_45852395原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。