笔者在拿到这道题的时候,一开始思路是从从2开始,如果n能整除i,那么n/=i,一直到n不能整除i,因子数+1,再开始判断n能否整除i+1,一直这样做退出条件是n==1.

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int sum=0;
        for(int i=2;i!=n;i++)
        {
            int d=0;//用于判断i是否可以作为一个因子
            whlie(n%i==0)
            {
                n/=i;
                d=1;//i可以作为因子,d变1 
            } 
            if(d) sum++; 
        }
        cout<<sum<<endl;
    }
 } 

上面的代码其实可以解决这个问题,但是会超时,问题就在于当n的某个因子为极大的质数时候或者n本身就是极大的质数时候,i便要从2一直一个试到那个极大的质数,这样便会耗费大量时间。
这时我们便可以借鉴我们之前用过判断一个数是否为质数的办法,比如要判断n是否为质数,我们只要看从
2<=i<sqrt(n)这个范围有没有n的因子便可,这样便缩小了搜寻范围。
所以我们改进版的代码如下,循环终结的条件变成i<sqrt(n),这样的话,在n逐渐变小的同时,搜索范围也随着变小,倘如退出循环后,n!=1,这说明最后的n是一个质数,我们只需要在因子数上再+1便可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int sum=0;
        for(int i=2;i<sqrt(n);i++)
        {
            int d=0;
            while(n%i==0)
            {
                d=1;
                n=n/i; 
            }

            if(d) sum++;
            if(n==1) break;
        }
        if(n!=1) sum++;
        cout<<sum<<endl;
    }
 }