题解
统计数码
1 条题解
-
0
解题思路
题目要求计算 a×b 的结果里,数字 c 出现了几次。
a 和 b 可能特别大(几十位甚至上百位),直接存进 long long 会溢出,所以要用高精度乘法。
高精度乘法的做法和手算竖式一模一样:
- 把 a、b 当成字符串读入,再一位一位转成数字,存进数组(个位放在数组最前面,方便从低位开始算)。
- 模拟竖式:第 i 位的数字乘第 j 位的数字,结果加到答案数组的第 i+j 位,也就是 res[i+j] += a[i]*b[j]。
- 全部乘完后,从低位到高位处理进位:每一位超过 9 就往上一位进 1。
- 去掉结果前面的 0。
- 最后数一数结果数组里有几个数字等于 c,输出次数。
参考代码
// 用途:统计大整数 a*b 的结果中数码 c 出现的次数(高精度乘法) #include <iostream> using namespace std; char sa[1005], sb[1005]; int a[1005], b[1005], res[2005]; int main() { int c; cin >> sa >> sb >> c; // 求两个数的长度(个位放最前面) int la = 0, lb = 0; while (sa[la]) la++; while (sb[lb]) lb++; 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 < la; i++) for (int j = 0; j < lb; j++) res[i + j] += a[i] * b[j]; // 统一进位 int len = la + lb; for (int i = 0; i < len; i++) { res[i + 1] += res[i] / 10; res[i] %= 10; } // 去掉前导 0 while (len > 1 && res[len - 1] == 0) len--; // 统计数码 c 出现的次数 int cnt = 0; for (int i = 0; i < len; i++) if (res[i] == c) cnt++; cout << cnt << endl; return 0; }复杂度分析
设 a 有 la 位、b 有 lb 位。乘法要两重循环,时间复杂度是 O(la×lb);进位和统计都只要扫一遍,是 O(la+lb)。所以总时间复杂度 O(la×lb)。
- 1