1 条题解

  • 0
    @ 2026-5-7 9:44:21

    文字教学

    当数字极大(如长达 2000 位)时,需采用高精度乘法模拟竖式计算:

    1. 用字符串读入,将各位数字逆序存入整型数组(个位在下标 0 处)。
    2. 两层循环,将第一个数的第 i 位与第二个数的第 j 位相乘,结果加到c[i+j]上。
    3. 统一处理进位:从低位到高位,c[i+1] += c[i] / 10c[i] %= 10
    4. 去掉前导零后逆序输出;若结果全零则输出 0

    时间复杂度 O(n·m),在这里足够。


    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        string s1, s2;
        cin >> s1 >> s2;
        int a[2005] = {0}, b[2005] = {0}, c[4005] = {0};
        int la = s1.size(), lb = s2.size();
        for (int i = 0; i < la; ++i) a[i] = s1[la-1-i] - '0';
        for (int i = 0; i < lb; ++i) b[i] = s2[lb-1-i] - '0';
        for (int i = 0; i < la; ++i)
            for (int j = 0; j < lb; ++j)
                c[i+j] += a[i] * b[j];
        int lc = la + lb;
        for (int i = 0; i < lc; ++i) {
            c[i+1] += c[i] / 10;
            c[i] %= 10;
        }
        while (lc > 1 && c[lc-1] == 0) --lc;
        for (int i = lc-1; i >= 0; --i) cout << c[i];
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    301
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者