【原理】线性筛生成素数表,把每个可以作为因子的素数都薅到秃
【剪枝】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; }