题解
大整数乘以小整数
1 条题解
-
0
解题思路
a的位数最多有 1000 位,远远超过了int、long long能存下的范围,所以要用高精度来做——也就是一位一位地处理。做法:把大整数
a当字符串读进来,转成数组时个位放在最前面(下标 0),这样进位就很方便。然后从个位开始,每一位都乘上小整数b,把超过 10 的部分往高一位进,每一位只留下个位数字。全部乘完后再处理最高位可能剩的进位,最后从高位到低位把答案输出。参考代码
#include <iostream> using namespace std; char sa[1005]; // 用字符串读入大整数a int a[1005]; // 大整数a的每一位数字,个位放在下标0 int ans[1010]; // 乘法结果 int main() { int b; cin >> sa >> b; // 读入大整数a和小整数b int len = 0; while (sa[len]) len++; // 求a的位数 // 把字符串倒着存进数组,个位放最前面,方便往后进位 for (int i = 0; i < len; i++) { a[i] = sa[len - 1 - i] - '0'; } // 每一位都乘b for (int i = 0; i < len; i++) { ans[i] += a[i] * b; // 这一位乘b,还要加上低位传来的进位 ans[i + 1] += ans[i] / 10; // 超过10的部分往高位进一位 ans[i] %= 10; // 这一位只留下个位数字 } // 最高位可能还有进位没处理完 int maxLen = len; while (ans[maxLen]) maxLen++; // 从高位到低位输出 for (int i = maxLen - 1; i >= 0; i--) { cout << ans[i]; } return 0; }复杂度分析
设大整数
a有 n 位,只要从低位到高位扫一遍,时间复杂度是 O(n);需要一个长度为 n 的数组来存每一位,额外空间复杂度是 O(n)。
- 1