题解
先加再乘
1 条题解
-
0
解题思路
要算 (a+b)×c,a、b、c 的长度都不超过 200 位,直接乘会超出 long long,所以要用高精度。
分两步走:
第一步:算 a+b(高精度加法)
把 a 和 b 一位一位转成数字,个位放在数组最前面。从个位开始逐位相加,每位超过 9 就向上一位进 1。得到和 s。
第二步:算 s×c(高精度乘法)
乘法模拟竖式:第 i 位的数字乘第 j 位的数字,结果累加到第 i+j 位,最后统一进位。
这和手算两位数乘两位数的方法一模一样,只是数位特别多。
参考代码
// 用途:计算 (a+b)*c,a、b、c 都是大整数(长度不超过 200) #include <iostream> using namespace std; char sa[205], sb[205], sc[205]; int a[205], b[205], c[205]; int sum[205], res[405]; 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 ls = (la > lb ? la : lb); int up = 0; for (int i = 0; i < ls; i++) { int v = a[i] + b[i] + up; sum[i] = v % 10; up = v / 10; } while (up) { // 最高位进位 sum[ls] = up % 10; up /= 10; ls++; } // 第二步:sum * c(高精度乘高精度) for (int i = 0; i < ls; i++) for (int j = 0; j < lc; j++) res[i + j] += sum[i] * c[j]; int len = ls + lc; for (int i = 0; i < len; i++) { res[i + 1] += res[i] / 10; res[i] %= 10; } while (len > 1 && res[len - 1] == 0) len--; // 输出结果 for (int i = len - 1; i >= 0; i--) cout << res[i]; cout << endl; return 0; }复杂度分析
设 a、b、c 的位数分别是 la、lb、lc。加法是 O(la+lb),乘法两重循环是 O((la+lb)×lc)。总时间复杂度 O((la+lb)×lc)。
- 1