比筛法慢,比筛法省空间
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
//分解质因数的一个关键:最多只有一个质因数是大于根号自己的
//int是可以表示10e9的,范围没超
void Func_eg69(void){
int n;
while(scanf("%d",&n) != EOF){
if(n == 2){
printf("1\n");
continue;
}
vector<int> v;
v.push_back(2);
for(int i=3; i<=sqrt(n); i++){
for(int j=0; j<v.size(); j++){
if(v[j]>sqrt(i)){//幸存,自己是质数
v.push_back(i);
break;
}
if(i%v[j] == 0){//寄了,是合数
break;
}
}
}//得到了根号n以下所有质数 这个耗时应该比筛法久,但比筛法省空间
int i=0;
int cnt = 0;
while(i<v.size()){
while(n%v[i] == 0){
cnt++;
n /= v[i];
}
i++;
}
if(n==1){
;
}else if(n>1){//剩下了一个大于根号n的质因数。一定是个质因数,因为一个合数必可被分解质因数且大于根号n的质因数最多一个
cnt++;
}
printf("%d\n",cnt);
}
}
int main(){
Func_eg69();
return 0;
}