蓝桥杯4-R格式-2

zzzxyy / 2024-10-21 / 原文

3.高精度乘法

#include<iostream>   // 引入输入输出流库
#include<cstring>    // 引入字符串处理库
using namespace std;

char s1[2005], s2[2005]; // 用于存储输入的两个大数
int a[2005], b[2005], c[2005]; // 数组用于存储数字和结果

int main()
{
    int la, lb, lc; // 分别存储s1和s2的长度,以及结果的长度
    cin >> s1; // 从标准输入读取第一个大数
    cin >> s2; // 从标准输入读取第二个大数
    la = strlen(s1); // 计算第一个大数的长度
    lb = strlen(s2); // 计算第二个大数的长度

    // 将字符串s1中的字符转换为数字,存储在数组a中,逆序存储
    for (int i = 0; i < la; i++)
    {
        a[la - i] = s1[i] - '0'; // 将字符转为对应的整数
    }

    // 将字符串s2中的字符转换为数字,存储在数组b中,逆序存储
    for (int i = 0; i < lb; i++)
    {
        b[lb - i] = s2[i] - '0'; // 将字符转为对应的整数
    }

    lc = la + lb; // 结果的最大可能长度是两个数长度的和

    // 进行大数乘法,类似手动乘法的过程
    for (int i = 1; i <= la; i++)
    {
        for (int j = 1; j <= lb; j++)
        {
            c[i + j - 1] += a[i] * b[j]; // 计算对应位a的乘积并加到结果中
            c[i + j] += c[i + j - 1] / 10; // 处理进位
            c[i + j - 1] %= 10; // 当前位保持在0-9之间
        }
    }

    // 如果结果最高位为0且该结果不为0,减少结果长度
    if (c[lc] == 0 && lc > 0) lc--;

    // 从高位到低位输出结果
    for (int i = lc; i > 0; i--)
        cout << c[i]; // 输出结果数组中的数字

    return 0; // 返回0表示程序正常结束
}