大整数乘法
上一期(高精度加法)
今天我们来研讨一下高精度乘法。
题目描述:
将两个大整数(最多100位)相乘,输出结果。
输入样例:
123456789
987654321
输出样例:
121932631112635269
代码(想粘走的就粘走):
#include<iostream>
#include<string>
using namespace std;
int main(){
string as,bs;
int an[101]={0},bn[101]={0},c[10200]={0},aLen,bLen,cLen;
cin>>as>>bs;
aLen=as.length();
bLen=bs.length();
//倒序存储两个数于整型数组中
for(int i=0;i<aLen;i++){
an[aLen-i-1]=as[i]-'0';
}
for(int i=0;i<bLen;i++){
bn[bLen-i-1]=bs[i]-'0';
}
//进行乘法运算,结果存于c[]
for(int i=0;i<bLen;i++){
for(int j=0;j<aLen;j++){
c[i+j]+=an[j]*bn[i];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
cLen=aLen+bLen;
//删除结果高位的前缀0
while(c[cLen-1]==0 && cLen>1){
cLen--;
}
//将结果倒序输出
for(int i=cLen-1;i>=0;i--){
cout<<c[i];
}
cout<<endl;
return 0;
}
乘法原理:
乘法竖式关键点分析
1.核心代码(乘法运算部分)是由模拟乘法竖式算出来的:
(1) 数1的倒数第i位与数2的倒数第j位相乘所得到的值应存在结果的倒数第i+j位上。
(2) 如果结果的i+j位大于9,则进位到i+j+1位。
c[i+j]+=an[j]*bn[i];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
-
i位数 与 j位数 相乘,其结果最多为 i+j 位。
-
要注意结果前缀中的0以及结果为0的情况。
while(c[cLen-1]==0 && cLen>1){
cLen--;
}
测试样例
输入样例1
999
99
输出样例1
98901
输入样例2
00999
00000099
输出样例2
98901
输入样例3
98765432123456789
0
输出样例3
0
有人说:“编写文章20%的内容就可获得80%的进度”,那么,下一期,你能不能找出那20%?,我在高精度除法的世界中等你!
网友评论