藍橋杯4-R格式-2

zzzxxyy發表於2024-10-16

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表示程式正常結束
}