题解:洛谷 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
posted @ 2026-02-17 08:22  团爸讲算法  阅读(1)  评论(0)    收藏  举报