题目描述
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
示例1
输入
120
输出
5
解题思路:利用素数筛选法预先筛选出在数据范围内的素数,然后判断其是否为n的因数。若确定某素数为n的因数,则通过试除确定其对应的幂指数,最后求出各个幂指数的和即为所求
还有一个问题是素数筛选只筛选到100000即可。因为n至多存在一个大于sqrt(n)的素因数(否则两个大于sqrt(n)的数相乘即大于n)。因而只有将n所有小于sqrt(n)的素数从n中除去,剩余的部分必为该大素因数,并且有且仅有一个。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void Init(); 5 6 int mark[100001]; 7 int prime[10001]; 8 int primeSize; 9 10 int main() 11 { 12 int n; 13 // int ansPrime[30];//按顺序保存分解出的素因数 14 int ansSize,ans; //分解出素因数个数 15 int ansNum[30]; //保存素因数的幂数 16 int i; 17 Init(); 18 19 while( scanf("%d",&n)!=EOF) 20 { 21 ansSize = 0; 22 ans = 0; 23 24 for( i=0; i<primeSize; i++) 25 { 26 if( n%prime[i]==0 ) 27 { 28 // ansPrime[ansSize] = prime[i]; 29 ansNum[ansSize] = 0; 30 while( n%prime[i]==0) 31 { 32 ansNum[ansSize]++; 33 n /= prime[i]; 34 } 35 ansSize++; 36 if( n==1 ) break; //n变为1表明n的所有素因素全部分解完 37 } 38 } 39 if( n!=1) 40 { 41 //若测试完到100000内的素数.n仍被分解为1,则下一个因素一定是此时的n 42 // ansPrime[ansSize] = n; 43 ansNum[ ansSize++] = 1; //其幂指数一定是1 44 } 45 for(i=0; i<ansSize; i++ ) 46 { 47 ans += ansNum[i]; 48 } 49 printf("%d\n",ans); 50 } 51 return 0; 52 } 53 54 void Init() 55 { 56 int i,j; 57 primeSize=0; 58 59 for( i=1; i<=100000; i++) 60 { 61 mark[i] = 0; 62 } 63 for( i=2; i<100000; i++) 64 { 65 if( mark[i]==1) continue; 66 prime[primeSize++] = i; 67 if(i >=1000) continue; 68 for( j=i*i; j<100000; j+=i) 69 { 70 mark[j] = 1; 71 } 72 } 73 }