美文网首页
高精度数(大整数)乘法

高精度数(大整数)乘法

作者: 朱红_fc5d | 来源:发表于2019-05-25 21:53 被阅读0次

    大整数乘法

    上一期(高精度加法)
    今天我们来研讨一下高精度乘法。

    题目描述:
    将两个大整数(最多100位)相乘,输出结果。

    输入样例:
    123456789
    987654321

    输出样例:
    121932631112635269

    代码(想粘走的就粘走):

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(){
        string as,bs;
        int an[101]={0},bn[101]={0},c[10200]={0},aLen,bLen,cLen;
        
        cin>>as>>bs;
        
        aLen=as.length();
        bLen=bs.length();
        
        //倒序存储两个数于整型数组中 
        for(int i=0;i<aLen;i++){
            an[aLen-i-1]=as[i]-'0';
        }
        
        for(int i=0;i<bLen;i++){
            bn[bLen-i-1]=bs[i]-'0';
        }
    
        //进行乘法运算,结果存于c[]
        for(int i=0;i<bLen;i++){
            for(int j=0;j<aLen;j++){
                c[i+j]+=an[j]*bn[i];
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
         
        cLen=aLen+bLen;
        
        //删除结果高位的前缀0 
        while(c[cLen-1]==0  && cLen>1){
            cLen--;
        }
        
        //将结果倒序输出
        for(int i=cLen-1;i>=0;i--){
            cout<<c[i];
        }
        cout<<endl;
        
        return 0;
    }
    

    乘法原理:

    乘法竖式

    关键点分析

    1.核心代码(乘法运算部分)是由模拟乘法竖式算出来的:
    (1) 数1的倒数第i位与数2的倒数第j位相乘所得到的值应存在结果的倒数第i+j位上。
    (2) 如果结果的i+j位大于9,则进位到i+j+1位。

    c[i+j]+=an[j]*bn[i];
    c[i+j+1]+=c[i+j]/10;
    c[i+j]%=10;

    1. i位数 与 j位数 相乘,其结果最多为 i+j 位。

    2. 要注意结果前缀中的0以及结果为0的情况。

    while(c[cLen-1]==0 && cLen>1){
    cLen--;
    }

    测试样例

    输入样例1

    999
    99

    输出样例1

    98901

    输入样例2

    00999
    00000099

    输出样例2

    98901

    输入样例3

    98765432123456789
    0

    输出样例3

    0

    有人说:“编写文章20%的内容就可获得80%的进度”,那么,下一期,你能不能找出那20%?,我在高精度除法的世界中等你!

    相关文章

      网友评论

          本文标题:高精度数(大整数)乘法

          本文链接:https://www.haomeiwen.com/subject/zkozzqtx.html