【原理】线性筛生成素数表,把每个可以作为因子的素数都薅到秃
【剪枝】10^9显然超出int范围,且空间也不够,需要剪枝。
n=sqrt(n)*sqrt(n),显然若有一个因子>sqrt(n),则其它因子全部<=sqrt(n)
那么只需要算出10^5以内的素数,再不停/=即可。
如果n最终除得1,说明所有因子都<=sqrt(n)
否则有一个>sqrt(n),也就是/=之后现在的n
#include <iostream>
#include<queue>
using namespace std;
void GeneratePrim(int end,queue<int> &list){
bool* prim = (bool*)malloc(sizeof(bool)*(1+end));
for(int i=2;i<=end;i++)
prim[i] = true;
prim[0] = false;
prim[1] = false;
for(int i=0;i<=end;i++){
if(prim[i]==false) continue;
list.push(i);
for(int k=2;i*k<=end;k++) prim[i*k] = false;
}
}
int main(){//例题6.9 清华大学 质因数的个数
int n;
queue<int> list;
GeneratePrim(100000,list);
while(cin>>n){
int counter = 0;
while(!list.empty()){
int factor = list.front();
list.pop();
while(n%factor==0){
n/=factor;
counter++;
}
}
if(n!=1) counter++;
cout<<counter<<endl;
}
return 0;
}

京公网安备 11010502036488号