#include <stdio.h>
#include <string.h>
// 素数判定。注意:n不能太大
int is_prime(int n)
{ int i;
for( i = 2;i*i <= n;i++)
if(n % i == 0) return 0;
return 1;
} // 素数表
int prime[100], count = 0;
int main()
{ // n和各个素数的指数
int i, n,p[100];
// 构造素数表
for( i = 2;i <= 100;i++)
if(is_prime(i)) prime[count++] = i; // 把100以内的素数放在 prime数组里
while(scanf("%d",&n) == 1)
{ printf("%d !=",n);
memset(p,0,sizeof(p)); 初始化 数组P
int maxp = 0,j;
for( i=1;i<=n;i++)
{// 必须把i复制到变量m中,而不要在做除法时直接修改它
int m =i;
for(j = 0;j < count;j++)
while(m%prime[j] == 0)
{ m/=prime[j];
p[j]++;
if(j > maxp) maxp = j; // 更新最大素因子下标
}
}
// 只循环到最大下标
for(i = 0;i <= maxp;i++)
printf("%d",p[i]);
printf("\n");
}
return 0 ;
}
一个求素数的函数
int is_prime(int n)
{ int i;
for( i = 2;i*i <= n;i++)
if(n % i == 0) return 0;
return 1;
} 这一部分应该记住。之前有碰见过。( 一个数n 如果是合数,那么它的所有的因子不超过sqrt(n)-n 的开方)
注意:
做这一题是,不知道如何处理这个N!,如果可以转化成整数,那可以用以前的知识解决了。但是
N很大的时候,就不行了。
理论依据:
也可以写成
num=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 其中[]为取整
求N!有几个要注意的地方。
1.最大的质因子不会超过N,
2.关于公式的转化:
式子中把一些东西看成一个整体。举例:
num=N/pi^1+N/pi^2+N/pi^3;
==>
N/p1^1+(N/p1^1)/p1^1+((N/p1^1)/p1^1)/p1^1;
这样的话就可以写成一个solve函数。