题目描述
求正整数N(N>1)的质因数的个数。相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
示例1
输入
120
输出
5
#include<stdio.h>
bool mark[100001];
int prime[100001];
int primesize;
void init() {
primesize = 0;
for (int i = 1; i <= 100000; i++)
mark[i] = false;
for (int i = 2; i <= 100000; i++) { //筛选2到100000内所有素数
if (mark[i] == true)
continue;
prime[primesize++] = i;
if (i >= 1000)
continue;
for (int j = i*i; j <= 100000; j += i)
mark[j] = true;
}
}
int main() {
init();
int n;
while (scanf("%d", &n) != EOF) {
int ansprime[30]; //按顺序保存分解出的质因数
int anssize = 0; //分解出质因数的个数
int ansnum[30]; //保存分解出的质因数对应的指数
for (int i = 0; i < primesize; i++) { //依次测试每一个素数
if (n%prime[i] == 0) {
ansprime[anssize] = prime[i]; //若该素数能整除被分解数,则该素数为其素因数
ansnum[anssize] = 0; //初始化幂指数为0
while (n%prime[i] == 0) {
ansnum[anssize]++;
n /= prime[i];
}
anssize++;
if (n == 1)
break;
}
}
if (n != 1) { //若测试完2到100000内所有素因数,n仍未被分解至1
//则剩余的因数一定是n,一个大于100000的素因数
ansprime[anssize] = n;
ansnum[anssize++] = 1;
}
int ans = 0;
for (int i = 0; i < anssize; i++)
ans += ansnum[i];
printf("%d\n", ans);
}
return 0;
}