我是大帅比ZED @ 2022-11-07 11:46:25
/*
·题目描述
求 n! 中某个数码出现的次数。
·输入格式
第一行为 t(t≤10),表示数据组数。
接下来 t 行,每行一个正整数 n(n≤1000) 和数码 a。
·输出格式
对于每组数据,输出一个整数,表示 n! 中 a 出现的次数。
*/
#include <stdio.h>
#include <string.h>
using namespace std;
int factorial[100001] = {0}, tem[5];//阶乘 n小于1000
int copy_fac[100001];//用来作为factorial的工具存储
int len1, len2 = 1;//len1是tem数组的长度 len2是阶乘的长度
void num_copy()
{
for (int i=1; i<=len2; i++)
factorial[i] = copy_fac[i];
memset(copy_fac, 0, sizeof(copy_fac));
}
int main (void)
{
int n;//n个数据
scanf("%d", &n);
for (int i=1; i<=n; i++)//循环n次
{
int x, a, count = 0;//x是到x的阶乘 a是阶乘中出现的数 count计数
scanf("%d%d", &x, &a);//读入
factorial[1] = 1;//初始化
for (int j=2; j<=x; j++)//开始阶乘
{
len1 = j / 10 + 1;//如j是111 那么len1 = 2 + 1 = 3
int t = j, count2 = 1;
while (t != 0)
{
tem[count2] = t % 10;
t /= 10;
count2++;
}
while (tem[len1] == 0)//去除前导零
len1--;
len2 += len1;//如99*99 = 9801 不超过2+2
for (int i2=1; i2 <= len2; i2++)
{
for (int k=1; k<=len1; k++)//进行计算
{
copy_fac[i2+k-1] += factorial[i2] * tem[k];
copy_fac[i2+k] += copy_fac[i2+k-1]/10;//进位并累加
copy_fac[i2+k-1] %= 10;//留下当前位
}
}
while(copy_fac[len2] == 0 && len2 > 0)//清除前导零
len2--;
num_copy();
}
/*for (int i=len2; i>0; i--)//测试阶乘对没有
printf("%d", factorial[i]);*/
for (int j2=len2; j2>0; j2--)
if (factorial[j2] == a)
count++;
if (i != n)
printf("%d\n", count);//输出结果
else
printf("%d", count);//输出结果
memset(factorial, 0, sizeof(factorial));//清零
}
return 0;
}
/*
测试:
-----------------------------
-----------------------------
总结:
*/
也不知道是哪里错了, 我现在突然下不了数据,我也不知道哪里错了,然后随便捏造了几个数据,和题解比对,感觉没什么问题