题解
修补计算
1 条题解
-
0
解题思路
这是一道大整数减法题。减数里有一些数字看不清,题目要求把看不清的
*全部替换成 5,再算减法。关键点:
- 题目保证替换后 m < n,而且相减过程没有借位,所以结果一定是正数。
- 要用高精度减法:把两个数倒着放进数组,从低位往高位逐位相减。
- 替换
*的时候要小心:减数 m 可能比被减数 n 短,m 不够的位数就按 0 处理(数组里本来就是 0)。 - 最后从高位往低位输出,注意去掉前导 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