题解 | #质因数的个数#

质因数的个数

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

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

/*预先筛选题面数据范围内的素数
* 题面范围N,筛选到maxN=sqrt(N)+1
* 原因:
* N最多存在一个>maxN的质因数(否则两个大于maxN的质因数乘起来>N)
* 只需将<=maxN的素因数从n中去除
* 剩余的部分必为>maxN的质因数(至多有一个)
* 不必测试maxN到n的素数
* 如果除完<maxN的素因数后,n>1;
* 表明n存在一个大于MAXN的因子且为质因子
* 其幂指数也必定为1
*/

/*对于输入n
* 1 遍历<n的素数,判断是否为n的因数
* 2 确定某素数是因数
* 3 试除,确定幂指数
*/

const int N = 1e9;
//const int maxN=sqrt(N)+1; //就会报错,有很大问题
const int maxN = 31623;

vector<int> prime;
bool isPrime[31623];
//如果用注释的那种方法会报错:
//error: array bound is not an interger constant before ']' token

void Initial() { //初始化isPrime数组,和prime向量
    for (int i = 0; i < maxN; i++) {
        isPrime[i] = true;
    }
    isPrime[0] = false;
    isPrime[1] = true;
    for (int i = 2; i < maxN; i++) {
        if (isPrime[i] == true) {
            prime.push_back(i);
            for (int j = i * i; j < maxN; j += i) {
                isPrime[false];
            }
        }
    }
    return ;
}


int main() {
    Initial();
    int n;
    while (scanf("%d", &n)!=EOF) {
        int answer = 0;
        int total = prime.size();
        for (int i = 0; prime[i] < n && i < total; i++) {
            if (n % prime[i] == 0) {
                n /= prime[i];
                answer++;
                while (n % prime[i] == 0) { //继续试除
                    n /= prime[i];
                    answer++;
                }
            }
        }
        if (n > 1) {
            answer++;
        }
        printf("%d\n", answer);
    }
    return 0;
}

error: variable length array declaration not allowed at file scope

array bound is not an interger constant before ']' token

注意全局变量数组长度的定义!!(在dev-c++上面能过有些OJ也有可能出问题)

全部评论

相关推荐

暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务