top1编程
← 返回题目
题解

大整数乘以小整数

1 条题解

  • 0
    @ 2026-8-3 18:17:33

    解题思路

    a 的位数最多有 1000 位,远远超过了 int、long long 能存下的范围,所以要用高精度来做——也就是一位一位地处理。

    做法:把大整数 a 当字符串读进来,转成数组时个位放在最前面(下标 0),这样进位就很方便。然后从个位开始,每一位都乘上小整数 b,把超过 10 的部分往高一位进,每一位只留下个位数字。全部乘完后再处理最高位可能剩的进位,最后从高位到低位把答案输出。

    参考代码

    #include <iostream>
    using namespace std;
    
    char sa[1005];      // 用字符串读入大整数a
    int a[1005];        // 大整数a的每一位数字,个位放在下标0
    int ans[1010];      // 乘法结果
    
    int main() {
        int b;
        cin >> sa >> b;          // 读入大整数a和小整数b
        int len = 0;
        while (sa[len]) len++;   // 求a的位数
    
        // 把字符串倒着存进数组,个位放最前面,方便往后进位
        for (int i = 0; i < len; i++) {
            a[i] = sa[len - 1 - i] - '0';
        }
    
        // 每一位都乘b
        for (int i = 0; i < len; i++) {
            ans[i] += a[i] * b;        // 这一位乘b,还要加上低位传来的进位
            ans[i + 1] += ans[i] / 10; // 超过10的部分往高位进一位
            ans[i] %= 10;              // 这一位只留下个位数字
        }
    
        // 最高位可能还有进位没处理完
        int maxLen = len;
        while (ans[maxLen]) maxLen++;
    
        // 从高位到低位输出
        for (int i = maxLen - 1; i >= 0; i--) {
            cout << ans[i];
        }
        return 0;
    }
    

    复杂度分析

    设大整数 a 有 n 位,只要从低位到高位扫一遍,时间复杂度是 O(n);需要一个长度为 n 的数组来存每一位,额外空间复杂度是 O(n)。

    • 1