题目:当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过10位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过20位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.
思路:
首先,这么大的数字是无法用基本的数据类型表示的,这里我只能想到和题目提示的一样用字符串解决问题。大概就是按下标依次访问每个字符串的单个字符,把字符转成数字进行计算,最后把计算结构转成字符串存储,最后输出。
这里,我用两个数组分别记录了前一次和本次两次相乘的结果,然后根据下标来求和,最后所有求和结束后,再分别求每位上的数的余数和该进位的数,把数字转为字符串记录,最后从后往前输出就行。值得注意的是,记得考虑最高位进位为0时的情况。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
string b;
cin>>a>>b;
if(a.size()>b.size())
swap(a,b);
int m=a.size();
int n=b.size();
int p[20]={0};
int q[20]={0};
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
stringstream ss;
int x,y;
ss<<a[i];
ss>>x;
ss.clear();
ss<<b[j];
ss>>y;
p[j+i]=x*y;
}
for(int k=0;k<20;k++){
q[k]=p[k]+q[k];
}
for(int k=0;k<20;k++){
p[k]=0;
}
}
string num="";
for(int i=m+n-1-1;i>=0;i--){
int yushu=0;
int jia=0;
yushu=q[i]%10;
jia=(q[i]-yushu)/10;
if(i!=0){
q[i-1]=q[i-1]+jia;
}
stringstream ss;
string s;
ss<<yushu;
ss>>s;
num=num+s;
if(i==0&&jia!=0){
ss.clear();
ss<<jia;
ss>>s;
num=num+s;
}
}
for(int i=num.size()-1;i>=0;i--){
cout<<num[i];
}
return 0;
}