题目背景
高精度乘法模板题。
题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
输入输出样例
输入
1
2
输出
2
说明/提示
每个非负整数不超过 102000。
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
char a[10010],b[10010];
int p[10010],q[10010],s[10010];
int main(){
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
memset(s,0,sizeof(s));
cin>>a>>b;
int n=strlen(a);
int m=strlen(b);
for(int i=0;i<n;i++) p[n-i]=a[i]-48;
for(int i=0;i<m;i++) q[m-i]=b[i]-48;
for(int i=1;i<=n;i++){
int x=0;
for(int j=1;j<=m;j++){
s[i+j-1]=s[i+j-1]+x+p[i]*q[j];
x=s[i+j-1]/10;
s[i+j-1]%=10;
}
s[i+m]=x;
}
int len=n+m;
while(s[len]==0&&len>1){
len--;
}
for(int i=len;i>=1;i--){
cout<<s[i];
}
}
有注释版
#include<bits/stdc++.h>
using namespace std;
char a[10010], b[10010]; // 用于存储两个输入的大数
int p[10010], q[10010], s[20010]; // p 和 q 用于存储大数的数字形式,s 用于存储乘积结果
int main() {
memset(p, 0, sizeof(p)); // 初始化 p 数组
memset(q, 0, sizeof(q)); // 初始化 q 数组
memset(s, 0, sizeof(s)); // 初始化 s 数组,存储乘积结果
cin >> a >> b; // 输入两个大数
int n = strlen(a); // 获取第一个数的长度
int m = strlen(b); // 获取第二个数的长度
// 将第一个大数的每一位数字存入 p 数组,注意反向存储
for (int i = 0; i < n; i++) {
p[n - i] = a[i] - 48; // 将字符转为数字,并存储在 p 数组中
}
// 将第二个大数的每一位数字存入 q 数组,注意反向存储
for (int i = 0; i < m; i++) {
q[m - i] = b[i] - 48; // 将字符转为数字,并存储在 q 数组中
}
// 逐位计算乘积
for (int i = 1; i <= n; i++) {
int x = 0; // 存储进位
// 对于 p[i] 和 q[j],计算乘积并加到结果数组 s 中
for (int j = 1; j <= m; j++) {
s[i + j - 1] = s[i + j - 1] + x + p[i] * q[j]; // 当前位乘积加上之前的进位
x = s[i + j - 1] / 10; // 更新进位
s[i + j - 1] %= 10; // 当前位的数字(对 10 取余)
}
s[i + m] = x; // 更新最后的进位
}
// 去除多余的前导零
int len = n + m; // 乘积的最大位数是 n + m
while (s[len] == 0 && len > 1) {
len--; // 如果最高位是 0,减小结果的位数
}
// 输出结果
for (int i = len; i >= 1; i--) {
cout i >= 1; i--) {
cout << s[i]; // 从高位到低位输出
}
return 0;
}