输入正整数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 }
View Code

分析:
  因am×an=a(m+n),则只需把所有素因子对应的指数累加起来;注意到n<=100,这些素因子不会超过100,输出时忽略到最后的0即可。

 posted on 2016-04-01 22:59  tostring_char  阅读(337)  评论(2编辑  收藏  举报