c++习题32-大整数乘法

目录

一,题目 

二,思路 

三,代码 


一,题目 

描述

求两个不超过200位的非负整数的积。

输入描述

有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

输出描述

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

用例输入 1 

12345678900
98765432100

用例输出 1 

1219326311126352690000

二,思路 

之前做过大整数加法和大整数减法的题:
c++习题26-大整数加法_大整数加法求两个不超过200位的非负整数的和。-CSDN博客

c++习题27-大整数减法_求两个大的正整数相减的差。 输入描述 共2行,第1行是被减数a,第2行是减数b(a > b)-CSDN博客
由于乘法运算的过程和加法,减法不一样,需要不断的将结果对位相加,并且,运算次数取决于参与乘法运算的两个数的位数,例如,126×7, 运算3*1=3次就可以得到结果882,如果是126×17,就需要运算3*2=6次,得到结果2142。由于循环次数=参与乘法运算的两个数的位数相乘,即 LA*LB,因此可以使用双层for循环,内外层循环的次数可以交换。

这里以126×7为例:

步骤如下: 

  1. 输入字符串 a="126",b="7"
        string a, b;
        cin >> a >> b;
  2. 将输入的两个字符串分别倒序加入整型容器A和B中,A={6,2,1},B={7};
        int LA = a.size(), LB = b.size();
        vector<int> A(LA),B(LB),C(LA + LB, 0);
        for (int i = 0; i < LA; i++) A[i] = a[LA - i - 1] - '0';
        for (int i = 0; i < LB; i++) B[i] = b[LB - i - 1] - '0';
  3. 中间用来处理运算,由于运算的过程中需要将结果存储起来,因此需要定义声明一个容器变量C存储输出结果:
    vector<int> C(lA + lB, 0);

    容器A的元素个数:LA=3,容器B的元素个数:LB=1;所以C={0,0,0,0};

    =======================
    第一次循环
    i=0,j=0,
    C[i+j]+=A[i] * B[j]
    =C[0+0]+=A[0] * B[0]=0+6*7=42;
    此时C[0+0]=42

    C[i+j+1]+= C[i + j] / 10
    =C[0+0+1]+=42/10=0+4=4;

    C[i+j]%=10=2;    
    此时C[0+0]=2

    得到C=[2,0,0,0]
    =======================
    第二次循环
    i=1,j=0,
    C[i+j]+=A[i] * B[j]
    =C[1+0]+=A[1] * B[0]=4+2*7=18;
    此时C[1+0]=18

    C[i+j+1]+= C[i + j] / 10
    =C[1+0+1]+=18/10=0+1=1;

    C[i+j]%=10=8;    
    此时C[1+0]=8

    得到C=[2,8,0,0]
    ========================
    第三次循环
    i=2,j=0,
    C[i+j]+=A[i] * B[j]
    =C[2+0]+=A[2] * B[0]=1+1*7=8;
    此时C[2+0]=8

    C[i+j+1]+= C[i + j] / 10
    =C[2+0+1]+=8/10=0+0=0;

    C[i+j]%=10=8;    
    此时C[2+0]=8

    得到C=[2,8,8,0]

  4. 最后根据数字0的数量,找到非零元素个数并倒序输出容器C
        int K = LA + LB - 1;
        while (K > 0 && C[K] == 0) K--;
        for (int i = K; i >= 0; i--) cout << C[i];

三,代码 

#include <bits/stdc++.h>
using namespace std;
int main() {
    string a, b;
    cin >> a >> b;
    int LA = a.size(), LB = b.size();
    vector<int> A(LA),B(LB),C(LA + LB, 0);
    for (int i = 0; i < LA; i++) A[i] = a[LA - i - 1] - '0';
    for (int i = 0; i < LB; i++) B[i] = b[LB - i - 1] - '0';
    for (int i = 0; i < LA; i++) {
        for (int j = 0; j < LB; j++) {
            C[i + j] += A[i] * B[j];
            C[i + j + 1] += C[i + j] / 10;
            C[i + j] %= 10;
        }
    }
    int K = LA + LB - 1;
    while (K > 0 && C[K] == 0) K--;
    for (int i = K; i >= 0; i--) cout << C[i];
    return 0;
}

有问题请在评论区留言或者是私信我,回复时间不超过一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值