算法竞赛入门 P82 5.4.2
题目大意: 输入正整数n , 把n! =1*2*3*……*n 分解乘素因子相乘形式,并从大到小输出各个素数的指数。
样例输入:
5
53
样例输出:
5!= 3 1 1
53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
1 /* 2 算法竞赛入门经典 P82 5.4.2 3 因子和阶乘 4 5 */ 6 7 #include <cstdio> 8 #include <memory.h> 9 10 //判断是否为素数 11 int is_prime(int n) 12 { 13 for(int i=2;i*i<=n;i++) 14 { 15 if(n%i == 0) 16 { 17 return 0; 18 } 19 20 } 21 return 1; 22 } 23 24 25 26 const int MAXN = 100; 27 int prime[MAXN]; // 素数表 28 29 int n,p[MAXN]; // p 是各个素数的指数 30 int count=0; 31 int main() 32 { 33 for(int i=2;i<=MAXN;i++) 34 { 35 if(is_prime(i)) 36 { 37 prime[count++]=i; 38 } 39 } 40 41 while(scanf("%d",&n)==1) 42 { 43 printf("%d = ",n); 44 memset(p,0,sizeof(p)); 45 int maxp=0; 46 for(int i=1;i<=n;i++) //阶乘 47 { 48 int m=i; 49 for(int j=0;j<count;j++) 50 { 51 while(m%prime[j] == 0) 52 { 53 m/=prime[j]; 54 p[j]++; 55 if(j>maxp)maxp=j; 56 } 57 } 58 59 } 60 for(int i=0;i<=maxp;i++) 61 { 62 printf("%d ", p[i]); 63 } 64 printf(" "); 65 66 } 67 68 69 70 return 0; 71 }