题目链接
一看到阶乘两个字,那这题就一定是一道普通的高精度×单精度的题目了,但是还是有几点需要注意:
- 乘完之后,可能还会有剩余的进位,需要在位数(我这里是
p
)增加的同时加上; - 数组中的第一位需要是 1 1 1,而不是 0 0 0,因为 0 0 0乘上任何数都为 0 0 0;
- 进位有可能是多位数
- 数组要清零;
- 数组不能定的太小了,容易WA或RE。一开始我定的是 1 0 3 10^3 103,不够。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e4;
int a[N + 5];
int n, m;
long long ans;
int main() {
ios::sync_with_stdio(false);
int T; cin >> T;
while (T--) {
memset(a, 0, sizeof(a)); //数组清零
a[1] = 1; //第一位为1
cin >> n >> m;
int p = 1, ext; //p为位数,ext为进位
for (int i = 2; i <= n; i++) {
ext = 0; //进位
for (int j = 1; j <= p; j++) {
a[j] = a[j] * i + ext;
ext = a[j] / 10;
a[j] %= 10;
}
while (ext > 0) { //乘完之后剩余的进位
a[++p] = ext % 10; //考虑到进位可能回事多位数,所以用while循环
ext /= 10;
}
}
ans = 0;
for (int j = 1; j <= p; j++)
ans += (a[j] == m); //统计出现次数
cout << ans << endl;
}
return 0;
}