题目大意:
输入一个数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 }