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;
}