求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
示例1
输入
120
输出
5
过程:提前计算好10^5以内的质数,遍历时先用N除以min(10^5, sqrt(N))以内的质因子,直到最后。如果N变成了1,说明它没有大于sqrt(N)的质因子。而如果到最后N不为1,说明其存在一个大于等于10^5的质因子,此时因为min(10^5, sqrt(N))以内的质因子均已遍历完毕,将计数器加一,结束循环既可。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <memory.h>
int primeNumber[100000];// prime number from 2 to 100000
int pNCount; // count how many prime numbers there are
bool isPrimeNumber(int n)
{
if(n == 1) return false;
for(int i = 2; i*i <= n; i++)
{
if(n % i == 0)
return false;
}
return true;
}
int main()
{
int pNCount = 0;
for(int i = 2; i < 100000; i++)
{
if(isPrimeNumber(i))
primeNumber[pNCount++] = i;
}
int n;
while(scanf("%d", &n) != EOF)
{
int counter = 0;
while(n > 1)
{
int i;
for(i = 0; i < pNCount && primeNumber[i] <= n; i++)
{
if(n % primeNumber[i] == 0)
{
n /= primeNumber[i];
break;
}
}
if(i == pNCount)
{
n = 1;
}
counter++;
}
printf("%d\n", counter);
}
}