大数相乘算法
蓝桥杯例题
当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,
可以采用字符串的方法来实现两个大数之间的乘法。具体来说,
首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,
然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),
最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,
则输出结果为:774980393241726.
算法实现代码C++
const int maxn = 100;
int a[maxn],b[maxn];
int len1,len2;
int ans[maxn];
char aim[maxn];
int main(){
//freopen("in.txt","r",stdin);
//读入并将数据方向反转
memset(aim,0,sizeof(aim));
scanf("%s",aim);
len1 = strlen(aim);
int cur = 0;
for(int i=len1-1;i>=0;i--){
a[cur++] = aim[i] - '0';
}
memset(aim,0,sizeof(aim));
scanf("%s",aim);
len2 = strlen(aim);
cur = 0;
for(int i=len2-1;i>=0;i--){
b[cur++] = aim[i] - '0';
}
//完成输入
memset(ans,0,sizeof(ans));
for(int i=0;i<len1;i++){//a
for(int k=0;k<len2;k++){//b
//下面这句话要结合所给博客思路重点理解
ans[i+k] += (a[i]*b[k]);
}
}
//开始进位
int jin = 0;
for(int i=0;i<len1+len2;i++){
ans[i] += jin;
jin = ans[i] / 10;
ans[i] %= 10;
}
//输出
int s = len1 + len2;
while(ans[s]==0)s--;
for(int i=s;i>=0;i--){
cout<<ans[i];
}
cout<<endl;
return 0;
}
//774980393241726
//774980393241726
OK