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