求助大佬们,不知道哪里错了 我随便用了几个数据 与 题解的答案是一样的
查看原帖
求助大佬们,不知道哪里错了 我随便用了几个数据 与 题解的答案是一样的
99244
我是大帅比ZED楼主2022/11/7 11:46
/*
  ·题目描述
  求 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;
}
/*
  测试:
  -----------------------------
  -----------------------------
  总结:
  
  
 */

也不知道是哪里错了, 我现在突然下不了数据,我也不知道哪里错了,然后随便捏造了几个数据,和题解比对,感觉没什么问题

2022/11/7 11:46
加载中...