n至多只存在一个大于sqrt(n)的素因数
1.利用素数筛法(欧拉筛法)筛得0-100000区间内所有素数
2.输入n
3.依次测试步骤1中得到的素数能否整除n,若能则表明该素数为它的一个素因数
4.不断将n除以该素因数,直到不能被整除为止
5.若在完成某个素数的幂指数统计后,n变为1,则表明n的所有素因数全部被分解出来,这样就不用再去遍历后续的素数,分解活动提前终止
6.若遍历、测试、分解完所有预处理的素数,n仍旧没被除成1,则表明n存在一个大于100000的因子,且该因子必为素因子,且其幂指数必然为1
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
bool IsPrime[100001] = {0};
int p[100001];
int pNum;
void FindPrime(){
mem(p, 0);
pNum = 0;
for(int i = 2; i <= 100000; i++){
if(!IsPrime[i]){
p[pNum++] = i;
}
for(int j = 0; j < pNum && (i * p[j]) <= 100000; j++){
IsPrime[i * p[j]] = 1;
if(i % p[j] == 0){
break;
}
}
}
}
int main(){
int n;
FindPrime();
while(~scanf("%d", &n)){
int num = 0, cnt = 0;
for(int i = 0; i < pNum; i++){
if(n % p[i] == 0){//如果p[i]是n的因子
while(n % p[i] == 0){
num++;
n /= p[i];
}
}
if(n == 1) break;
}
if(n != 1){
num++;
}
printf("%d\n", num);
}
return 0;
}
京公网安备 11010502036488号