时间限制1.00s 内存限制125.00MB 难易度:普及−
【题目描述】
给出两个非负整数,求它们的乘积。
【输入格式】
输入共两行,每行一个非负整数。
【输出格式】
输出一个非负整数表示乘积。
【输入输出样例】
输入 #1
1 2
输出 #1
2
【说明/提示】
每个非负整数不超过 10^2000。
【参考代码】
本题需要高精度计算,不会高精计算的可以参考作者之前的文章,这里不过多解释了。
#include<bits/stdc++.h>
using namespace std;
string mul(string a,string b) //高精度乘法(a,b均为非负整数)
{
const int L=1e5;
string s;
int na[L],nb[L],nc[L],La=a.size(),Lb=b.size(); //na存储被乘数,nb存储乘数,nc存储积。
//fi11(na,na+L,0);fi11(nb,nb+L,0);fi11(nc,nc+L,0); //将na,nb,nc都置为0。
for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0'; //将字符串表示的大整形数转成i整形数组表示的大整形数。
for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0';
for(int i=1;i<=La;i++)
for(int j=1;j<=Lb;j++)
nc[i+j-1]+=na[i]*nb[j]; //a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)。
for(int i=1;i<=La+Lb;i++)
nc[i+1]+=nc[i]/10,nc[i]%=10; //统一处理进位。
if(nc[La+Lb]) s+=nc[La+Lb]+'0'; //判断第i+j位上的数字是不是0.
for(int i=La+Lb-1;i>=1;i--)
s+=nc[i]+'0'; //将整形数组转成字符串。
return s;
}
int main()
{
string a,b;
cin>>a>>b;
if(a=="0"||b=="0") cout<<"0";
else cout<<mul(a,b);
return 0;
}