输入正整数n(2<=b<=100),把阶乘n!=1*2*3*4*...*n分解成素因子相乘的形式,从小到大输出各个素数(2、3、5...)的指数。例如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
代码:
#include <stdio.h>
#include <string.h>
#define MAX 1000
int prime[MAX],count=0;
int f(int n)
{
int i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int n,p[MAX];
int i,j,maxp,m;
//1.建立一个素数表
for(i=2;i<=100;i++)
{
if(f(i))
{
prime[count]=i;
count ++;
}
}
//2.输入n
while (scanf("%d",&n)==1)
{
printf("%d!=",n);
maxp=0;
memset(p,0,sizeof(p));
//3.把i复制到变量m中,不要做除法时直接修改
for(i=1;i<=n;i++)
{
m=i;
for(j=0;j<count;j++)
{
while(m%prime[j]==0)
{
m=m/prime[j];
p[j]++;
if(j>maxp) maxp=j;//更新最大因子的下标
}
}
}
//4.输出
for(i=0;i<=maxp;i++)
{
printf(" %d",p[i]);
}
printf("\n");
}
return 0;
}