题解
三个大整数相加
1 条题解
-
0
解题思路
三个数都很大(最多 2000 位),直接相加会溢出,所以要高精度加法:一位一位地加。
做法:把每个大整数当字符串读进来,转成数组时个位放在最前面。然后把三个数同一位置上的数字相加,超过 10 就往高一位进 1。最后从高位到低位把结果输出。
参考代码
#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'; // 找到三个数中最长的位数 int n = la; if (lb > n) n = lb; if (lc > n) n = lc; // 三个数同一位置的数字相加 for (int i = 0; i < n; i++) { ans[i] += a[i] + b[i] + c[i]; // 这一位三个数字加起来 ans[i + 1] += ans[i] / 10; // 超过10的部分进位 ans[i] %= 10; } // 最高位可能还有进位 while (ans[n]) n++; // 从高位到低位输出 for (int i = n - 1; i >= 0; i--) cout << ans[i]; return 0; }复杂度分析
设三个数中最长的位数为 n,只要扫一遍,时间复杂度是 O(n);额外空间复杂度也是 O(n)。
- 1