问题简单重述:
输入正整数n(2<=n<=100),把n!分解,如825!=3*5^2*11应表示为0 1 2 0 1,表示分别有0,1,2,0,1个2,3,5,7,11.程序应忽略比最大素因子更大的素数,否则末尾会有无穷0.
样例输入:
5
53
样例输出:
5!= 3 1 1
53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
问题分析:
素数判定(n过大可用素筛),之后素数打表,最后开数组累计器。
code:
#include<stdio.h>
#include<string.h>
//素数判定,此处略过
//素数表
int prime[100],count=0;
int main()
{
int n,p[100];
//构造素数表
for(int i=2;i<=100;i++)
{
if(is_prime(i)) prime[count++]=i;
}
while(scanf("%d",&n)!=EOF)
{
printf("%d!=",n);
memset(p,0,sizeof(p));
int maxp=0;
for(int i=1;i<=n;i++)
{
//必须把i复制到变量m中
int m=i;
for(int j=0;j<count;j++)
{
while(m%prime[j]==0)
{
m/=prime[j];
p[j]++;
if(j>maxp) maxp=j;
}
}
}
//只循环到最大下标
for(int i=0;i<=maxp;i++)
{
printf(" %d",p[i]);
}
printf("\n");
}
return 0;
}