1 条题解

  • 0
    @ 2025-5-13 21:10:12

    题目分析

    这道题目要求我们计算给定整数n的阶乘(n!)的十进制表示中,每个数字(0-9)出现的次数。由于n可以达到366,而366!是一个781位的超大数字,直接计算阶乘然后统计数字显然不可行,需要使用大数运算的技巧。

    解题思路

    1. 大数阶乘计算:使用数组来模拟大数运算,每个数组元素存储一位数字。
    2. 数字统计:在计算完阶乘后,遍历数组统计每个数字出现的次数。
    3. 输出格式:按照特定格式输出统计结果。

    复杂度分析

    • 时间复杂度:O(n * m),其中n是输入的数字,m是大数的位数(这里设为1000)。
    • 空间复杂度:O(m),用于存储大数。

    代码

    #include<stdio.h>
    const int max=1000;
    int main()
    {
    	int i,j,k,n;
    	while(scanf("%d",&n)&&n)
    	{
    		int a[max+1]={0};
    		a[max]=1;
    		for(i=2;i<=n;i++)
    		{
    			for(j=max;j>=0;j--)
    				a[j]*=i;
    			for(j=max;j>=0;j--)
    			{
    				if(a[j]>=10)
    				{
    					a[j-1]+=a[j]/10;
    					a[j]%=10;
    				}
    			}
    		}//(0)   2
    		int s[10]={0};
    		int flag=0;
    		for(i=0;i<max+1;i++)
    		{
    			if(a[i]) flag=1;
    			if(flag) s[a[i]]++;
    		}
    		printf("%d! --\n",n);
    		printf("   (0)%5d    (1)%5d    (2)%5d    (3)%5d    (4)%5d\n",s[0],s[1],s[2],s[3],s[4]);
    		printf("   (5)%5d    (6)%5d    (7)%5d    (8)%5d    (9)%5d\n",s[5],s[6],s[7],s[8],s[9]);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    455
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    3
    已通过
    1
    上传者