【题目】
输入正整数n(2<=n<=100),把阶乘n!=123*…n分解成素因子相乘的形式,从小到大输出各个素数(2,3,5…)的指数。例如825=35511应表示成(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
【分析】
因为a的m次方乘以a的n次方等于a的m乘以n次方,我们只需要把所有素因子对应的指数累加起来。所以我们一个数组p来保存对应的各个素数的指数,并标记最大的那个素因子的下标为maxp,最后循环输出到最大素因子的指数即可。注意到n<=100,这些素因子不会超过100,输出时忽略最后的0即可。再次强调:is_prime函数不适合特别大的n。
【代码】
#include<stdio.h>
#include<string.h>
int is_prime(int n)/*判断素数*/
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int prime[100],count=0;
int main()
{
int n,p[100];
for(int i=2;i<=100;i++)/*建立素数表*/
{
if(is_prime(i)>0)
{
prime[count++]=i;
}
}
while(scanf("%d",&n)==1)
{
printf("%d=",n);
memset(p,0,sizeof(p));/*初始化数组*/
int maxp=0;
for(int i=1;i<=n;i++)
{
int m=i;/*不能直接修改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;
}
【补充】
数学是算法的基石。很多算法竞赛中都有一些数学味很浓的题。所以,要学好数学呀呀呀!!!
【寄语】
也许终点只有绝望和失败,但这绝不是停止前行的理由。
所以,加油肝!