高精度乘法与高精加法类似
#include <iostream>
#include <string>
using namespace std;
int main()
{string m,n;
int p[100000]={0};//用来记录最后得的每位数
cin>>n>>m;
int n_lenth=n.length (),m_lenth=m.length(),lenth=n_lenth+m_lenth;
//两数字相乘的位数最大不超过两数位数和,
/*注意:此处说明它可以小于但是不能大于例如0*1000 两数位数和为5
但结果是0只有一位数*/
for(int i=0;i<m_lenth;i++)
for(int j=0;j<n_lenth;j++)
p[i+j]+=(n[n_lenth-j-1]-'0')*(m[m_lenth-i-1]-'0');
/*因为是乘法,个位数上的数乘完存放的位置要错位,方便后来相加应使用i+j
且循环分两层代表乘法竖式的中间错位加和的两层*/
for(int i=0;i<lenth;i++)
{
p[i+1]+=(p[i]/10);
p[i]%=10;
}//此为进位运算可以通用
while (p[lenth]==0&&lenth>0)
lenth--;
for(int i=lenth;i>=0;i--)
cout<<p[i]; /*由于乘法易出现上面描述的0*1000之类位数与结果位数
不同的情况(0000的结果和0相同但只输出0),要将长度减去且注意长度要大于
0避免最后执行时成为-1*/
return 0;
}
总结:
1.乘法与加法类似关键在于中间值的存放,对于乘法来说如何错位相加
2.在进制存放前的步骤都是中间值的存放
加法的:
for(int i=0;i<lenth;i++){p[i]+=(n[lenth-i-1]-'0'+m[lenth-i-1]-'0');}
乘法的:
for(int i=0;i<m_lenth;i++)
for(int j=0;j<n_lenth;j++){ p[i+j]+=(n[n_lenth-j-1]-'0')*(m[m_lenth-i-1]-'0');}
3.最后的进制存放可以当作模板
for(int i=0;i<lenth;i++)
{
p[i+1]+=(p[i]/10);
p[i]%=10;
}
4.最后的问题是解决前面最后答案的0
这个自行变通,只要知道有这个问题就可以了
如:加法的
if(p[lenth]!=0){
for(int i=lenth;i>=0;i--)
cout<<p[i];}
else{
for(int i=lenth-1;i>=0;i--)
cout<<p[i]; }
乘法的:
while (p[lenth]==0&&lenth>0)
lenth--;
for(int i=lenth;i>=0;i--)
cout<<p[i];