主要思路:
模拟竖式:
1.先累加乘积
2.后进位存余
如图:
分别用数组下标表示后,易发现一个规律:
注意:
- 要保证和为i+j的所有a、b数组都要遍历到,所以要加上原来的c[i+j-1]。
- lenc的长度可能是lena+lenb-1,也可能是lena+lenb(有进位的情况下)。因此处理完c数组的乘积累加后,直接让lenc++,只要最终判断前导是不是为0即可。
是0的话就没有进位!
代码如下
#include<bits/stdc++.h>
using namespace std;
int a[101],b[101],c[101];
int main(void){
int lena,lenb,lenc;
string s1,s2;
cin>>s1>>s2;
lena=s1.length();
lenb=s2.length();
//将上述字符串以int型数据存入数组
//因为乘法是从个位算起,所以存储时到倒着存
for(int i=1;i<=lena;i++){
a[i]=s1[lena-i]-'0';//以数字存储
}
for(int j=1;j<=lenb;j++){
b[j]=s2[lenb-j]-'0';//以数字存储
}
//开始模拟乘法
//1.各位分别乘积累加
for(int x=1;x<=lenb;x++){//第二个乘数的个位与第一个乘数各个位相乘
for(int y=1;y<=lena;y++){
//每个数乘完后按照规律存入c数组中
c[x+y-1]+=a[y]*b[x];
}
}
//2.进位存余
lenc=lena+lenb-1;//c数组的长度总是最长数组的长度+较短数组的长度-1,因为每乘一位就要往前移动一位
for(int p=1;p<=lenc;p++){
c[p+1]+=c[p]/10;
c[p]%=10;
}
//3.处理c数组的前导0,防止乘数是0,此外最高进位处可能也是0
lenc++; //最高进位
while(c[lenc]==0&&lenc>1)
lenc--;
//确定好c数组的位数后,就可以倒序输出了
for(int q=lenc;q>=1;q--){
cout<<c[q];
}
return 0;
}