题解:洛谷 P1303 A*B Problem
【题目来源】
洛谷:P1303 A*B Problem - 洛谷 (luogu.com.cn)
【题目描述】
给出两个非负整数,求它们的乘积。
【输入】
输入共两行,每行一个非负整数。
【输出】
输出一个非负整数表示乘积。
【输入样例】
1
2
【输出样例】
2
【算法标签】
《洛谷 P1303 A*B Problem》 #模拟# #字符串# #高精度#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int c[2005] = {0}; // 用于存储乘法结果的每一位数字
// 高精度乘法函数:计算两个大整数的乘积
int amulb(string a, string b)
{
int j1[2005] = {0}, j2[2005] = {0}; // j1 和 j2 用于存储两个大整数的每一位数字
int lena = a.length(), lenb = b.length(); // lena 和 lenb 分别表示两个大整数的长度
int len = lena + lenb; // len 表示乘法结果的最大可能位数
// 将字符串 a 和 b 转换为 int 数组并翻转(方便从低位到高位计算)
for (int i = 0; i < lena; i++) j1[lena - i] = a[i] - '0'; // 将 a 的每一位字符转换为数字并翻转
for (int i = 0; i < lenb; i++) j2[lenb - i] = b[i] - '0'; // 将 b 的每一位字符转换为数字并翻转
// 逐位相乘
for (int i = 1; i <= lena; i++)
{
for (int j = 1; j <= lenb; j++)
{
c[i + j - 1] += j1[i] * j2[j]; // 当前位的乘积累加到 c[i+j-1]
c[i + j] += c[i + j - 1] / 10; // 处理进位
c[i + j - 1] %= 10; // 当前位只保留个位数
}
}
// 去除结果前导的 0
while (c[len] == 0 && len > 1)
len--;
return len; // 返回结果的位数
}
int main() {
string a, b; // 用于存储输入的两个大整数
int n; // 用于存储乘法结果的位数
cin >> a >> b; // 输入两个大整数
// 调用高精度乘法函数,计算 a * b 的结果
n = amulb(a, b);
// 输出结果(从高位到低位)
for (int i = n; i >= 1; i--)
cout << c[i];
return 0;
}
【运行结果】
12
4
48
浙公网安备 33010602011771号