题目描述
- 高精度乘法
给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
数据范围
1≤A的长度≤100000,
0≤B≤10000
样例
输入样例:
2
3
输出样例:
6
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
//1111111111111111111111111 25个1
int ans[100005],bns[100005],b,i,j,c[100005],len,jin,dlen,len0,tencnt,eightcnt;
const int eight=8;
string a,d;
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
memset(bns,0,sizeof(bns));
cin>>a>>d;
//scanf("%d",&b);
len=a.size();
for(i=0;i<len;i++)ans[len-i]=a[i]-'0';
dlen=d.size();
for(i=0;i<dlen;i++)bns[dlen-i]=d[i]-'0';
b=0; //乘数 string d 每8位截取一次 int b
j=1;
tencnt=1;
eightcnt=0; //每截取一次8位,b 的值要乘 10的8次方,相当于在乘积 前移8位
while(j<=dlen){
b=b+bns[j]*tencnt;
tencnt*=10; //权重
if(j%eight==0){ //每8位做一次 string a 乘 int b
jin=0;
for(i=1;i<=len;i++){
jin=ans[i]*b+jin+c[i+eightcnt]; //从第二次8位乘数 b 开始,c[]已经有上次 %10 的余数
c[i+eightcnt]=jin%10;
jin=jin/10;
}
i--;
while(jin>0)
{
i++;
jin=jin+c[i+eightcnt]; //从第二次8位乘数 b 开始,c[]已经有上次 %10 的余数
c[i+eightcnt]=jin%10;
jin/=10;
}
b=0; //截取的8位乘过之后,将 b 恢复 0
tencnt=1; //权重复位
eightcnt+=8; //eightcnt 加 8 相当于 b * 10的8次方
}
j++;
}
j--; // while循环结束 j 比 dlen 多加了 1,要减掉 1
if(j%eight>0){ //乘数长度不足8位,或者不是8的整倍数时,在前面while中没有做乘法
jin=0;
for(i=1;i<=len;i++){
jin=ans[i]*b+jin+c[i+eightcnt];
c[i+eightcnt]=jin%10;
jin/=10;
}
i--;
while(jin>0)
{
i++;
jin=jin+c[i+eightcnt];
c[i+eightcnt]=jin%10;
jin/=10;
}
b=0;
}
len0=len+dlen;
while(len0>1&&c[len0]==0)len0--; //去前缀 0
for(i=len0;i>=1;i--){
printf("%d",c[i]);
}
printf("\n");
return 0;
}
注意:此程序写的是高精度乘以高精度,请勿误解。
@[大家不要忘了点赞哟~]