1 条题解
-
0
文字教学
当数字极大(如长达 2000 位)时,需采用高精度乘法模拟竖式计算:
- 用字符串读入,将各位数字逆序存入整型数组(个位在下标 0 处)。
- 两层循环,将第一个数的第
i位与第二个数的第j位相乘,结果加到c[i+j]上。 - 统一处理进位:从低位到高位,
c[i+1] += c[i] / 10,c[i] %= 10。 - 去掉前导零后逆序输出;若结果全零则输出
0。
时间复杂度 O(n·m),在这里足够。
参考代码
#include <bits/stdc++.h> using namespace std; int main() { string s1, s2; cin >> s1 >> s2; int a[2005] = {0}, b[2005] = {0}, c[4005] = {0}; int la = s1.size(), lb = s2.size(); for (int i = 0; i < la; ++i) a[i] = s1[la-1-i] - '0'; for (int i = 0; i < lb; ++i) b[i] = s2[lb-1-i] - '0'; for (int i = 0; i < la; ++i) for (int j = 0; j < lb; ++j) c[i+j] += a[i] * b[j]; int lc = la + lb; for (int i = 0; i < lc; ++i) { c[i+1] += c[i] / 10; c[i] %= 10; } while (lc > 1 && c[lc-1] == 0) --lc; for (int i = lc-1; i >= 0; --i) cout << c[i]; cout << endl; return 0; }
- 1
信息
- ID
- 301
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
京公网安备 11011102002149号