高精度乘法运算及总结

高精度乘法与高精加法类似 

#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];  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Assault boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值