160 - Factors and Factorials

 

题目大意:

题目原文:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=3&problem=96&mosmsg=Submission+received+with+ID+11291690

输入一个数n要将n!分解成各个素数的乘积,输出各个素数因子所乘的次数。

如:5!=120=2*2*2*3*5;那么就是有三个2,一个3,一个5。

我的做法是将5!分开=5*4*3*2;然后逐一计算因子数,一个5,一个3, 4有两个2, 2又一个2,然后加起来,就是3个2。

最早是先把100内的素数都求出来,然后输入n之后从n开始分解。分解的方法是不断除以自己的因子。如100这个数,可以被2整除,则除以2,得到50;然后还是可以被2整除,则继续除以2,得到25;然后可以被5整除,则除以5,得到5;再除以5的到1;分解完成,得到的结果就是2个5,2个2。依次从100分解到2;全部加在一起就可以了。

附上代码:

View Code
 1 #include<stdio.h>
 2 int main()
 3 {
 4  int pri[25],n,i,j,bo,a[25];
 5  n=0;
 6  for(i=2;i<=100;i++)//求100内的素数存在pri数组内 
 7  {
 8    bo=0;
 9    for(j=2;j<i;j++)
10     {
11      if(i%j==0) {bo=1;break;}
12     }
13    if(bo==0) {pri[n]=i;n++;}
14  }
15  
16  while(1)
17  {
18   for(i=0;i<=25;i++) a[i]=0;//初始化a数组 
19   scanf("%d",&n);
20   if(n==0) break;
21   printf("%3d! =",n);
22   while(n>1)//从n循环到2 
23   {
24    int nn=n;
25    for(i=0;i<25;i++)
26    {
27     while(nn%pri[i]==0)
28      {
29       nn/=pri[i];//不断除以因子直到不能整除 
30       a[i]++;//每除以一次,计数一次。 
31      }
32    }
33    n--;
34   }
35   for(n=24;n>=0;n--)//为了满足后面的0全部不输出,先找出最后一个非0数所在的位置 
36   {
37    if(a[n]!=0) break;
38   }
39   for(i=0;i<=n;i++)//输出 
40    {
41      if(i%15==0&&i!=0) printf("\n      ");//15个要换行(6个空格) 
42      printf("%3d",a[i]);
43    }
44   printf("\n");
45  }
46  return 0;
47 }

posted on 2013-02-15 17:32  T^T  阅读(234)  评论(0编辑  收藏  举报

导航