高精度乘法我们依然是使用竖式乘法的思路来解题。不过要注意的是,在高精度乘法中需要考虑下标问题。如下图
我们可以看出,积的下标等于i(被乘数下标)+j(乘数下标)-1。这一步理解之后,我们来解决积长度的问题:可以看出,积的最大坐标等于乘数长度加被乘数长度,也就是lenc=i+j。
最后我们来整理思路:
1.创建数组存储数字
2.模拟竖式乘法
3.输出
接下来是代码:
1.创建数组并存储数字
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[10001]={};//创建数组存储数字
cin>>a>>b; //输入
lena = strlen(a);
lenb = strlen(b);//获取长度
for(int i=0;i<lena;i++){
a1[lena-i] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i] = b[i]-48;
}//从下标为1的地方开始逆序存储数字
这里从下标为1开始存储是为了控制下标,具体参考上文i+j-1。
2.模拟竖式乘法
for(int i=1;i<=lena;i++){
int x = 0;
for(int j=1;j<=lenb;j++){
c1[i+j-1] = a1[i]*b1[j]+x+c1[i+j-1];
x = c1[i+j-1]/10;
c1[i+j-1]%=10;
}//乘法运算
c1[lenb+i] = x;
}
这里要注意每次乘下一个数时,进位需要重新赋值为0。如不赋值为0,则会加上上一个被乘数产生的进位,导致数值不正确。
3.输出
int lenc = lena+lenb;
while(c1[lenc]==0 && lenc>1){
lenc--;//删除高位零
}
for(int i=lenc;i>=1;i--){
cout<<c1[i];
}//逆序输出
输出仍就是倒序输出,不过要最小到1,因为我们是从1开始倒序存储的。
删除高位零是因为我们声明的lenc(积的长度)是最大长度,而不是真实长度。也就会出现
10*10=0100的情况。但我们做判断是要注意留一位长度因为零乘任何数都等于0,否则将出现输入0时则没有输出的情况。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[10001]={};//创建数组存储数字
cin>>a>>b; //输入
lena = strlen(a);
lenb = strlen(b);//获取长度
for(int i=0;i<lena;i++){
a1[lena-i] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i] = b[i]-48;
}//从下标为11的地方开始逆序存储数字
for(int i=1;i<=lena;i++){
int x = 0;
for(int j=1;j<=lenb;j++){
c1[i+j-1] = a1[i]*b1[j]+x+c1[i+j-1];
x = c1[i+j-1]/10;
c1[i+j-1]%=10;
}//乘法运算
c1[lenb+i] = x;
}
int lenc = lena+lenb;
while(c1[lenc]==0 && lenc>1){
lenc--;//删除高位零
}
for(int i=lenc;i>=1;i--){
cout<<c1[i];
}//逆序输出
return 0;
}
好的下期我们更新高精度除法。