0
点赞
收藏
分享

微信扫一扫

知识:高精度乘法

自由情感小屋 2022-02-05 阅读 70
c++算法

高精度乘法,实质和加减法一样,为模拟乘法竖式运算。
这里先讲一下竖式计算的方法和原理: 
设相乘的两个数A=anan-1...a1a0,B=bmbm-1...b1b0(ai,bi分别表示A和B数位上的每一位数字),则A*B=(an*10n+an-1*10n-1+...+a1*101+a0*100)*(bm*10m+bn-1*10m-1+...+b1*101+b0*100)。
上式利用多项式乘法展开后我们发现:ai*10i*bj*10j=ai*bj*10i+j。
于是我们有了这样的做法:将A和B的每位数字拆分后存入a,b数组,a[i]*b[j]的结果存入c[i+j],再处理进位即可。 

#include<bits/stdc++.h> 
using namespace std;
   
int a[505],b[505],c[1010];
int lena,lenb,lenc;
string a1,b1;
   
int main(){
    cin>>a1>>b1;
    lena = a1.size()-1;
    lenb = b1.size()-1;
    for (int i = 0; i <= lena; i++){
        a[lena - i - 1] = a1[i] -'0';
    }
    for(int i = 0; i <= lenb; i++){
        b[lenb - i - 1] = b1[i] - '0';
    }    
    for(int i=0;i<=lena;i++)
        for(int j=0;j<=lenb;j++) 
            c[i+j]+=a[i]*b[j]; //结果直接累加在c数组中,相当于同时做了竖式中乘和加的过程。
    lenc=lena+lenb; //a[i]*b[j]的最高位相乘是a[lena]*b[lenb],结果在c[lena+lenb]中。
    for(int i=0;i<=lenc;i++)  //进位处理
    {
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    //最高位进位,最高位位置+1
    if(c[lenc+1]) lenc++;
    //输出
    for(int i=lenc;i>=0;i--) cout<<c[i];
    return 0;
}
举报

相关推荐

0 条评论