Time Limit: 5 Sec Memory Limit: 64 MB
Description
给出一个正整数N(0<=N<=10000),求N!有多少个0,1,2,…,9。
Input
输入有一行,为一个正整数N
Output
输出N!中0,1,2,…,9的个数(以空格隔开)
Sample Input
10
Sample Output
2 0 1 1 0 0 1 0 2 0
分析:
n!最多只有35660位(n=10000时),因为时间充足,所以可采用求大数阶乘的算法求出n!的具体数值,然后开一个足够大的数组存放,再然后遍历一遍数组,统计每个数字出现的次数即可。
C++实现代码如下:
#include<iostream>
#define MAX 100000
using namespace std;
int s[10];
int main()
{
int n,i,j,p,h,a[MAX];
for(i=0; i<10; i++)
s[i]=0;
cin>>n;
a[1]=p=1;
for(i=2; i<=n; i++,p=j-1)
{
for(j=1,h=0; j<=p; j++)
{
a[j]=a[j]*i+h;
h=a[j]/10;
a[j]%=10;
}
while(h>0)
{
a[j++]=h%10;
h/=10;
}
}
for(i=p; i>0; i--)
s[a[i]]++;
for(i=0; i<10; i++)
if(i==9)
cout<<s[i]<<endl;
else
cout<<s[i]<<" ";
return 0;
}