目录
一,题目
描述
求两个不超过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为例:
步骤如下:
- 输入字符串 a="126",b="7"
string a, b;
cin >> a >> b; - 将输入的两个字符串分别倒序加入整型容器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'; - 中间用来处理运算,由于运算的过程中需要将结果存储起来,因此需要定义声明一个容器变量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]=42C[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]=18C[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]=8C[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]
-
最后根据数字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;
}
有问题请在评论区留言或者是私信我,回复时间不超过一天。