n至多只存在一个大于sqrt(n)的素因数
1.利用素数筛法(欧拉筛法)筛得0-100000区间内所有素数
2.输入n
3.依次测试步骤1中得到的素数能否整除n,若能则表明该素数为它的一个素因数
4.不断将n除以该素因数,直到不能被整除为止
5.若在完成某个素数的幂指数统计后,n变为1,则表明n的所有素因数全部被分解出来,这样就不用再去遍历后续的素数,分解活动提前终止
6.若遍历、测试、分解完所有预处理的素数,n仍旧没被除成1,则表明n存在一个大于100000的因子,且该因子必为素因子,且其幂指数必然为1
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) bool IsPrime[100001] = {0}; int p[100001]; int pNum; void FindPrime(){ mem(p, 0); pNum = 0; for(int i = 2; i <= 100000; i++){ if(!IsPrime[i]){ p[pNum++] = i; } for(int j = 0; j < pNum && (i * p[j]) <= 100000; j++){ IsPrime[i * p[j]] = 1; if(i % p[j] == 0){ break; } } } } int main(){ int n; FindPrime(); while(~scanf("%d", &n)){ int num = 0, cnt = 0; for(int i = 0; i < pNum; i++){ if(n % p[i] == 0){//如果p[i]是n的因子 while(n % p[i] == 0){ num++; n /= p[i]; } } if(n == 1) break; } if(n != 1){ num++; } printf("%d\n", num); } return 0; }