题目描述
求 n! 中某个数码出现的次数。
输入格式
第一行为 t(t≤10),表示数据组数。接下来 t 行,每行一个正整数 n(n≤1000) 和数码 a。
输出格式
对于每组数据,输出一个整数,表示 n! 中 a 出现的次数。
输入样例
2
5 2
7 0
输出样例
1
2
code
#include<iostream>
#include<cstring>
using namespace std;
int c[100000];//因为是高精度乘法,所以数组要多开一点
int main()
{
int t, n, a;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n >> a;
memset(c, 0, sizeof(c));//将数组全部初始化为0
c[0] = 1;//让第一个数为1,不然怎么乘都是0
int l = 1;//l表示当前数据长度
for (int j = 2; j <= n; j++)//开始阶乘计算
{
int w = 0;
for (int k = 0; k < l; k++)//高精度乘单精度
{
c[k] = c[k] * j + w;
w = c[k] / 10;
c[k] %= 10;
}
while (w > 0)//处理多进位
{
c[l] = w % 10;
l++;
w /= 10;
}
}
int sum = 0;
for (int j = 0; j < l; j++)
if (c[j] == a) sum++;//统计个数
cout << sum << endl;
}
return 0;
}
- 无注释版
#include<iostream>
#include<cstring>
using namespace std;
int c[100000];
int main()
{
int t, n, a;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n >> a;
memset(c, 0, sizeof(c));
c[0] = 1;
int l = 1;
for (int j = 2; j <= n; j++)
{
int w = 0;
for (int k = 0; k < l; k++)
{
c[k] = c[k] * j + w;
w = c[k] / 10;
c[k] %= 10;
}
while (w > 0)
{
c[l] = w % 10;
l++;
w /= 10;
}
}
int sum = 0;
for (int j = 0; j < l; j++)
if (c[j] == a) sum++;
cout << sum << endl;
}
return 0;
}