步骤
1、利用素数筛选法筛出0~MAXN(sqrt(n)+1)内的所有素数
2、输入n
3、依次测试素数能否整除n,若能,则表明该素数为他的一个素因数
4、不断将n除以该素数,直到不能被该素数整除,同时统计其幂指数
5、遍历完预处理出来的素数后,若n为1,则表明n的所有素因数全部被分解了
6、遍历完预处理出来的素数后,若n不为1,则表明n存在一个大于MAXN的因子,该因子必为其素因数,其幂指数为1
注意
素数只筛选到sqrt(n)+1就行。因为,n至多存在一个>sqrt(n)的质因子,如果存在两个,相乘必定就大于n了,所以只存在一个。这样就解释了第6步
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
vector<int> res;
const int MAXN=sqrt(1e9)+1;
//bool isprime[MAXN]; //variable length array declaration not allowed at file scope
bool isprime[31623];
void init(int n){ //素数的判定
for(int i=0;i<MAXN;i++){
isprime[i]=true;
}
isprime[0]=false;
isprime[1]=false;
for(int i=2;i<MAXN;i++){
if(!isprime[i]){
continue;
}
res.push_back(i);
for(int j=i*i;j<MAXN;j+=i){
isprime[j]=false;
}
}
}
int main(){
int n;
cin>>n;
init(n);
int i=0,count=0;
while(i<res.size() && res[i]<n){
if(n%res[i]==0){
n/=res[i];
count++;
}
else{
i++;
}
}
if(n!=1){
count++;
}
cout<<count<<endl;
return 0;
}