题解
【基础】高精度乘单精度
1 条题解
-
0
解题思路
高精度乘单精度:大数 a(不超过 240 位)乘以较小的整数 b(不超过 10000)。
因为 a 太大,不能直接用 int 乘,但 b 很小,可以用数组处理 a 的每一位。
思路:
- 把 a 逆序存进数组,个位在 a[0]
- 每一位都乘 b
- 处理进位:从低位到高位,某一位超过 10 就向高位进位
- 去掉前导 0,从高位到低位输出
为什么每一位乘 b? 乘法竖式里,大数的每一位都要和小数 b 相乘。因为 b 是单精度,每位乘 b 的结果不会太大,方便处理。
处理进位要注意:乘完之后可能每一位都超 10,要统一从低位往高位进位,直到没有进位为止。
举例:111...111 × 10 = 111...1110
- 每位乘 10,得到 0、10、10、10……
- 进位后就是末尾多一个 0
参考代码
#include <iostream> #include <string> using namespace std; string s1; int b, p; int a[250]; int main() { cin >> s1 >> b; for (int i = 0; i < s1.size(); i++) a[s1.size() - 1 - i] = s1[i] - '0'; for (int i = 0; i < s1.size(); i++) a[i] = a[i] * b; // 每位乘 b for (int i = 0; i < s1.size() + 4; i++) { // 进位 if (a[i] >= 10) { a[i + 1] += a[i] / 10; a[i] = a[i] % 10; } } for (int i = s1.size() + 4 - 1; i >= 0; i--) { // 去前导 0 if (a[i] != 0) { p = i; break; } } for (int i = p; i >= 0; i--) cout << a[i]; return 0; }复杂度分析
- 时间复杂度:O(N),N 为 a 的位数
- 空间复杂度:O(N),存 a 的数组
- 1