1 条题解
-
0
题目分析
这道题目要求我们计算给定整数n的阶乘(n!)的十进制表示中,每个数字(0-9)出现的次数。由于n可以达到366,而366!是一个781位的超大数字,直接计算阶乘然后统计数字显然不可行,需要使用大数运算的技巧。
解题思路
- 大数阶乘计算:使用数组来模拟大数运算,每个数组元素存储一位数字。
- 数字统计:在计算完阶乘后,遍历数组统计每个数字出现的次数。
- 输出格式:按照特定格式输出统计结果。
复杂度分析
- 时间复杂度: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
- 上传者