分解质因子

https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9?tpId=40&tqId=21338&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    //若是到方根N仍大于1,则必还有且只还有1个质因数
    long M=100;
    while(cin>>M)
    {
        long count=0;
            for(long j=2;j<=sqrt(M);j++)
            {
             while(M%j==0)
             {
                 M=M/j;
                 count++;
             }
             if(M<=1)break;
            }
        if(M>1)count++;
        cout<<count<<endl;
    }  
    return 0;
}

用模板

bool prime[maxn];

void isprime()
{
    memset(prime,1,sizeof(prime));
    for(int i=2;i<maxn;i++)
    {
        for(int j=i+i;j<maxn;j+=i)
        prime[j]=0;
    }
}
#include <iostream>

using namespace std;
const int MAXN = 40000;//筛4w的素数是远远够的

bool used[MAXN];
int prim[MAXN];//存放素数
int SIZE = 0;//素数的个数
void is_prim()//埃氏素筛法
{
    for(int i = 2; i * i < MAXN; ++i)
    {
        if(!used[i])
            for(int j = 2 * i; j < MAXN; j += i)
                used[j] = true;
    }
    for(int i = 2; i < MAXN; ++i)
        if(!used[i]) prim[SIZE++] = i;
}
int main()
{
    is_prim();
    int n;
    while(cin >> n)
    {
        int ans=0;
        for(int i = 0; i < SIZE && n > 1; ++i)
        {
            while(n > 1 && n % prim[i] == 0)//当n大于1并且n能够除尽prim[i]
            {
                n /= prim[i];
                //cout << prim[i] << " ";
                ans++;
            }
        }
// if(n > 1) cout << n;//此时说明n是个素数,并且是大于4w的素数
// cout << endl;
        if(n>1)ans++;
        cout<<ans<<endl;
    }
    return 0;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/79393187
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞