题解 | #质因数的个数#

质因数的个数

https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9

本题的关键点是两个sqrt():

第一个sqrt

第一个sqrt出现在用埃拉托斯特尼筛法求一个范围的素数时,当我们在求1到s中谁是素数时,只需遍历到sqrt(s)即可,因为大于sqrt(s)的合数一定是由某些小于sqrt(s)的数组成的,那就一定在遍历到sqrt(s)时被定义为合数了。

第二个sqrt

第二个sqrt出现在:到底是求1到n的素数,还是求1到sqrt(n)的素数时。这里我们并不需要得到1到n的素数,因为若n有质因数大于sqrt(n),那必然是只有一个(因为两个sqrt(n)的素数相乘一定大于n了),所以我们只需要求1到sqrt(n)的素数

#include <bits/stdc++.h>
#include <cmath>
#include <vector>
using namespace std;

vector<int> getprime(int s){   //s = sqrt(n)
    vector<int> all(s + 1, 1);
    all[0] = 0;
    all[1] = 0;

    int _s = sqrt(s);

    for(int i = 2; i <= _s; i++){
        if(all[i] == 1){
            for(int j = i; j * i <= s; j++){
                all[i * j] = 0;
            }
        }
    }

    vector<int> prime;

    for(int i = 2;i <= s; i++){
        if(all[i] == 1) prime.push_back(i);
    }

    return prime;

}


int main() {
    int n;
    while (cin >> n) {
        vector<int> prime = getprime(sqrt(n));
        int ans = 0;
        for(int i = 0; i < prime.size(); i++){
            while(n % prime[i] == 0){
                n /= prime[i];
                ans++;
            }
        }
        if(n > 1) ans++;

        cout << ans << '\n';


    
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务