题解
计算多组大整数相乘
1 条题解
-
0
解题思路
两个数都不超过 100 位,乘积会溢出,要用高精度乘法。核心规律:
a的第 i 位(从 0 开始,个位是第 0 位)乘b的第 j 位,结果放到乘积数组的第 i+j 位。把每一对都乘完、累加好后,再统一从低位往高位处理进位。因为有多组数据,每组的数组都要清空后再计算。
参考代码
#include <iostream> using namespace std; char sa[105], sb[105]; int a[105], b[105]; int ans[210]; int main() { int t; cin >> t; while (t--) { cin >> sa >> sb; int la = 0, lb = 0; while (sa[la]) la++; while (sb[lb]) lb++; // 清空数组 for (int i = 0; i < 105; i++) { a[i] = 0; b[i] = 0; } for (int i = 0; i < 210; i++) ans[i] = 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的第i位乘b的第j位,放到结果的第i+j位 for (int i = 0; i < la; i++) for (int j = 0; j < lb; j++) ans[i + j] += a[i] * b[j]; // 统一处理进位 int hi = la + lb; for (int i = 0; i < hi; i++) { ans[i + 1] += ans[i] / 10; ans[i] %= 10; } // 去掉最高位可能多余的0 while (hi > 0 && ans[hi] == 0) hi--; // 输出 for (int i = hi; i >= 0; i--) cout << ans[i]; cout << endl; } return 0; }复杂度分析
设
a、b位数分别为 n、m,两层循环 n×m 次,时间复杂度 O(n×m);额外空间复杂度 O(n+m)。
- 1