题解
大整数相减
1 条题解
-
0
解题思路
要算 a-b,a 和 b 都可能特别大,而且结果可能是负数(比如 145-14567 = -67)。
高精度减法的关键:
- 先判断结果正负:比较 a 和 b 的大小。如果 a < b,就交换 a、b,让大的数在前,并在最后输出负号。
- 逐位相减:从个位开始,a[i] - b[i],不够减就向高位借 1(借来的 1 等于 10)。
- 去掉前导 0:如果结果是 0,输出一个 0 就行。
因为有多组数据,每算完一组要把数组清空,避免上一组残留的数字影响下一组。
参考代码
// 用途:计算大整数 a-b 的差,t 组数据,结果可能为负数(高精度减法) #include <iostream> using namespace std; char sa[1005], sb[1005]; int a[1005], b[1005], res[1005]; int main() { int t; cin >> t; while (t--) { cin >> sa >> sb; int la = 0, lb = 0; while (sa[la]) la++; while (sb[lb]) lb++; // 判断 a 和 b 谁大 int neg = 0; if (la < lb) neg = 1; else if (la == lb) { for (int i = 0; i < la; i++) { if (sa[i] != sb[i]) { neg = (sa[i] < sb[i]); break; } } int same = 1; for (int i = 0; i < la; i++) if (sa[i] != sb[i]) { same = 0; break; } if (same) { cout << 0 << endl; continue; } // 相等则差为 0 } // 转成数字数组,个位放最前面 for (int i = 0; i < la; i++) a[i] = sa[la - 1 - i] - '0'; for (int i = 0; i < lb; i++) b[i] = sb[lb - 1 - i] - '0'; // 如果 a 小,交换,让 a 始终是较大的数,并标记负号 if (neg) { for (int i = 0; i < 1005; i++) { int t2 = a[i]; a[i] = b[i]; b[i] = t2; } int t2 = la; la = lb; lb = t2; } // 十进制减法 int borrow = 0, len = la; for (int i = 0; i < len; i++) { int v = a[i] - b[i] - borrow; if (v < 0) { v += 10; borrow = 1; } else borrow = 0; res[i] = v; } while (len > 1 && res[len - 1] == 0) len--; // 去掉前导 0 if (neg) cout << "-"; for (int i = len - 1; i >= 0; i--) cout << res[i]; cout << endl; // 清空数组,准备下一组 for (int i = 0; i < 1005; i++) a[i] = b[i] = res[i] = 0; } return 0; }复杂度分析
设一组数据中 a 有 la 位、b 有 lb 位。比较大小和逐位相减都是 O(la+lb)。t 组数据加起来就是 O(t×(la+lb))。
- 1