因子和阶乘讨论的是这样的一个问题:
输入正整数n(2<=n<=100),把阶乘n! = 1x2x3x4x5...xn分解成素因子相乘的形式,从小到大输出各个素数(2、3、5、...)的指数。例如:825=3x5^2x11应表示成(0 1 2 0 1)
表示分别有0、1、2、0、1个2、3、5、7、11。程序应忽略比最大素因子更大的素数(否则末尾会有无穷多个0)
先贴上代码:
#include <stdio.h>
#include <string.h>
//素数判定,注意:n不能太大
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()
{
//存放n和各个素数的指数
int n,p[100];
//构造素数表
for(int i = 2; i <= 100; i++)
if(is_prime(i)) prime[count++] = i;
//count 表示100以内素数的个数 24
while(scanf("%d",&n) == 1)
{
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]整除,说明素数prime[j]是m的一个因子。
{
m /= prime[j]; //反复除以prime[j],直到素数prime[j]不能被m整除
p[j]++; //指数累加
if(j > maxp) maxp = j; //更新最大素因子下标
}
}
//只循环到最大下标
for( i = 0; i <= maxp; i++ )
{
printf(" %d",p[i]);
}
printf("\n");
}
return 0;
}
一直不理解都没有求出阶乘,怎么就可以求出素因子和素因子的指数的。
原来问题的关键在于m也就是i是每次相乘的一个因子,程序在while(m % prime[j] == 0)做这个判断的时候其实就是在判断prime[j]是否为m的一个因子,如果是m的因子,那肯定也是阶乘积的因子。p[j]只有累加的操作,不会被重置,也就是说相同的因子指数会被加在一起。比如m=2,prime[0] = 2的时候,这个时候p[0] = 1。当程序运行到m=4 ,prime[0] = 2的时候,这个时候会有两次m /= prime[j]; p[0]也会自加两次,得到p[0] = 3。其它地方的处理是一样的 。通过这种方式,求出了素因子的指数。