top1编程
← 返回题目
题解

修补计算

1 条题解

  • 0
    @ 2026-8-4 1:13:28

    解题思路

    这是一道大整数减法题。减数里有一些数字看不清,题目要求把看不清的 * 全部替换成 5,再算减法。

    关键点:

    1. 题目保证替换后 m < n,而且相减过程没有借位,所以结果一定是正数。
    2. 要用高精度减法:把两个数倒着放进数组,从低位往高位逐位相减。
    3. 替换 * 的时候要小心:减数 m 可能比被减数 n 短,m 不够的位数就按 0 处理(数组里本来就是 0)。
    4. 最后从高位往低位输出,注意去掉前导 0(比如结果是 0 开头的不要输出)。

    参考代码

    // 用途:两个大整数相减,减数中看不清的数字(*)用5替换
    // 题目保证替换后结果非负且减法无借位
    #include <iostream>
    using namespace std;
    int main() {
        char n[105], m[105];
        int a[105] = {0}, b[105] = {0}, r[105] = {0}; // 倒序存数字
        cin >> n >> m;
        int ln = 0, lm = 0;
        while (n[ln]) ln++;   // n的位数
        while (m[lm]) lm++;   // m的位数
        for (int i = 0; i < ln; i++) a[i] = n[ln - 1 - i] - '0'; // n倒序
        for (int i = 0; i < lm; i++) {   // m倒序,*号替换成5
            b[i] = (m[lm - 1 - i] == '*') ? 5 : m[lm - 1 - i] - '0';
        }
        for (int i = 0; i < ln; i++) {   // 逐位相减
            r[i] = a[i] - b[i];
            if (r[i] < 0) { r[i] += 10; a[i + 1]--; } // 借位(本题用不到)
        }
        int len = ln;
        while (len > 1 && r[len - 1] == 0) len--; // 去掉前导0
        for (int i = len - 1; i >= 0; i--) cout << r[i];
        return 0;
    }
    

    复杂度分析

    减法要处理被减数 n 的所有位,n 最多 100 位,时间复杂度是 O(位数),空间复杂度也是 O(位数),很快。

    • 1