质因数个数
思路:这题思路比较简单,即用待分解的数n逐步除以质因数,每除以一次就把个数num++,最后直到n=1或者找不到除n本身外的质因数(这里需要注意,因为这种情况需要把num+1,考虑n=37,它只有自己一个质因数,但是我们因数取得范围只有2~sqrt(37))。为了学习判断一个数是不是指数6,我还上网学习了判断质数的方法(其实这道题并不用判断除数是不是质因数,因为随着除数是每一轮+1循环判断是不是质因数的,若后面的除数是合数,那么这个除数肯定可以分解成比它更小的质数相乘,所以除数是不可能变到一个合数的)
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int a)
{
if (a <= 3)
return true;
if (a % 6 != 1 && a % 6 != 5)//a可能为 6k-1,6k,6k+1,6k+2,6k+3,6k+4,其中6k,6k+2,6k+3,6k+4均不可能是素数
return false;
int sq = sqrt(a);
for (int i = 5; i <= sq; i+=6) {//到了这里只有漏网之鱼n=6k-1或6k+1了,这两个明显是奇数。
if (a%i == 0 || a % (i + 2) == 0)//若n%(6i+2),(6i),(6i+4)==0,那么n明显是偶数,不符合漏网之鱼的特征;若n%(6i+3)==0,那么n%3==0,
return false;//但是6k%3==0,6k-1和6k+1在6k两边,明显n%3!=0,又不符合漏网之鱼得特征。所以漏网之鱼的因子只有可能是(6i-1)或(6i-1)
}
return true;
}
int main()
{
int N, num = 0;
while (cin >> N) {
int s = sqrt(N);
for (int i = 2; i <= s && N != 1;) {
if (!isPrime(i)) {
++i;
continue;
}
if (N%i == 0) {
++num;
N /= i;
continue;
}
else
++i;
}
if(N!=1)
cout << num+1 << endl;
else
cout<<num<<endl;
num = 0;
}
}


京公网安备 11010502036488号