题解
三个大整数加减
1 条题解
-
0
解题思路
计算
a + b - c,三个数都很大(最多 2000 位),用高精度分两步做:- 先加:
a和b逐位相加,超过 10 进位。 - 再减:结果逐位减
c,不够减就向高一位借 1(题目保证a+b ≥ c,不会出现负数)。
数字转数组时个位放最前面,进位和借位都方便。最后从高位到低位输出,并去掉开头的 0。
参考代码
#include <iostream> using namespace std; char sa[2005], sb[2005], sc[2005]; // 三个大整数(字符串) int a[2005], b[2005], c[2005]; // 数字数组,个位在下标0 int ans[2010]; // 结果 int main() { cin >> sa >> sb >> sc; // 求三个数的位数 int la = 0, lb = 0, lc = 0; while (sa[la]) la++; while (sb[lb]) lb++; while (sc[lc]) lc++; // 转成数字数组,个位放最前面 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'; for (int i = 0; i < lc; i++) c[i] = sc[lc - 1 - i] - '0'; // 第一步:a + b int n = (la > lb) ? la : lb; for (int i = 0; i < n; i++) { ans[i] += a[i] + b[i]; ans[i + 1] += ans[i] / 10; // 进位 ans[i] %= 10; } int hi = n; while (ans[hi]) hi++; // 加法可能多出最高位 // 第二步:再减 c(题目保证 a+b >= c) for (int i = 0; i < lc; i++) { ans[i] -= c[i]; if (ans[i] < 0) { // 不够减就向前借1 ans[i] += 10; ans[i + 1] -= 1; } } // 去掉结果开头的0 int pos = hi; while (pos > 0 && ans[pos] == 0) pos--; for (int i = pos; i >= 0; i--) cout << ans[i]; return 0; }复杂度分析
设最长的位数为 n,加法和减法各扫一遍,时间复杂度 O(n);额外空间复杂度 O(n)。
- 先加:
- 1