输入正整数n(2<=n<=100),把阶乘n!=1*2*3*…*n分解成素因子相乘的形式,从小到大输出各个以(2、3、4、5…)的指数。例如825=3*5*5*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
1 #include <stdio.h> 2 #include <string.h> 3 //素数判定 4 /* do NOT use this if x is very large or small 5 *n太小时n=1会被错误地判断为素数,太大时i*i可能溢出 6 */ 7 int is_prime(int n) 8 { 9 int i; 10 for(i = 2; i*i <= n; i++) //判断不超过sqrt(x)的整数i 11 if(n % i ==0) return 0; //一旦发现有一个大于1的因子,立刻返回0(假) 12 return 1; //最后返回1(真) 13 } 14 15 //素数表 16 int prime[100], count = 0; 17 int main() 18 { 19 //变量i,n和各个素数的指数 20 int i, n, p[100]; 21 //构造素数表 22 for(int i = 2; i <= 100; i++) 23 if(is_prime(i)) prime[count++] = i; 24 while(scanf("%d", &n) == 1) 25 { 26 printf("%d! =", n); 27 memset(p, 0, sizeof(p)); //string.h 28 int maxp = 0; //定义最大素数因子下标并赋初值 29 for(i = 1; i <= n; i++) 30 { 31 //必须把i复制到变量m中,而不要在做除法时直接修改它 32 int m = i; 33 for(int j = 0; j < count; j++) 34 while(m % prime[j] == 0) //反复除以prime[j],并累加p[i] 35 { 36 m /= prime[j]; 37 p[j]++; 38 if(j > maxp) maxp = j; //更新最大素数因子下标 39 } 40 } 41 //只循环到最大下标 42 for(i = 0; i <= maxp; i++) 43 printf(" %d", p[i]); 44 printf("\n"); 45 } 46 return 0; 47 }
分析:
因am×an=a(m+n),则只需把所有素因子对应的指数累加起来;注意到n<=100,这些素因子不会超过100,输出时忽略到最后的0即可。
亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!