nyoj 509 因子和阶乘
- 输入
- 第一行有一个整数n(0<n<10000),表示有n组测试数据;
接下来n行每行有一个整数 m(1<m<10000) - 输出
- 从小到大输出m分解成素因子相乘后各个素因子对应的指数
- 样例输入
-
2 5 53
- 样例输出
-
3 1 1 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
主要是解决超时问题,找因子时要进行优化。只有素数才可能是因子,因此可以将素数存起来,对2到n的所有数找因子的时候,就可直接通过prim数组(存素数的)进行整除,就可以省去很多时间了。
代码:1 2 #include<stdio.h> 3 #include<string.h> 4 #define Max 10005 5 int prim[Max],num[Max]; 6 7 void pp() //将素数存到prim数组里面 8 { 9 memset(prim,0,sizeof(prim)); 10 for(int i=2;i*i<Max;i++) 11 { 12 for(int j=i*2;j<Max;j+=i) 13 if(!prim[j]) 14 prim[j]=1; 15 } 16 int x=1; 17 for(int i=2;i<Max;i++) 18 { 19 if(!prim[i]) prim[x++]=i; 20 } 21 } 22 23 void find(int n) //找每个数的因子并标记个数 24 { 25 for(int i=2;i<=n;i++) 26 { 27 int y=i; 28 for(int j=1;;j++) 29 { 30 while(y%prim[j]==0) 31 { 32 num[prim[j]]++; 33 y=y/prim[j]; 34 } 35 if(y==1) 36 { 37 break; 38 } 39 } 40 } 41 } 42 43 int main() 44 { 45 int N,n,i; 46 pp(); 47 scanf("%d",&N); 48 while(N--) 49 { 50 memset(num,0,sizeof(num)); 51 scanf("%d",&n); 52 find(n); 53 for(i=2;i<=n;i++) 54 { 55 if(num[i]) 56 { 57 printf("%d",num[i]); 58 break; 59 } 60 } 61 for(i=i+1;i<=n;i++) 62 { 63 if(num[i]) 64 { 65 printf(" %d",num[i]); 66 } 67 } 68 printf("\n"); 69 } 70 } 71