top1编程
← 返回题目
题解

【基础】高精度乘单精度

1 条题解

  • 0
    @ 2026-7-31 12:17:04

    解题思路

    高精度乘单精度:大数 a(不超过 240 位)乘以较小的整数 b(不超过 10000)。

    因为 a 太大,不能直接用 int 乘,但 b 很小,可以用数组处理 a 的每一位。

    思路:

    1. 把 a 逆序存进数组,个位在 a[0]
    2. 每一位都乘 b
    3. 处理进位:从低位到高位,某一位超过 10 就向高位进位
    4. 去掉前导 0,从高位到低位输出

    为什么每一位乘 b? 乘法竖式里,大数的每一位都要和小数 b 相乘。因为 b 是单精度,每位乘 b 的结果不会太大,方便处理。

    处理进位要注意:乘完之后可能每一位都超 10,要统一从低位往高位进位,直到没有进位为止。

    举例:111...111 × 10 = 111...1110

    • 每位乘 10,得到 0、10、10、10……
    • 进位后就是末尾多一个 0

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    string s1;
    int b, p;
    int a[250];
    
    int main() {
        cin >> s1 >> b;
    
        for (int i = 0; i < s1.size(); i++) a[s1.size() - 1 - i] = s1[i] - '0';
    
        for (int i = 0; i < s1.size(); i++) a[i] = a[i] * b;  // 每位乘 b
    
        for (int i = 0; i < s1.size() + 4; i++) {  // 进位
            if (a[i] >= 10) {
                a[i + 1] += a[i] / 10;
                a[i] = a[i] % 10;
            }
        }
    
        for (int i = s1.size() + 4 - 1; i >= 0; i--) {  // 去前导 0
            if (a[i] != 0) { p = i; break; }
        }
        for (int i = p; i >= 0; i--) cout << a[i];
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为 a 的位数
    • 空间复杂度:O(N),存 a 的数组
    • 1