求救c++

题目总版

wxhhpsmaq__ @ 2024-11-01 22:16:36

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    cin >> n;
    long long ans = 0;
    while (n > 0)
    {
        ans++;
        long long cnt = 0;
        for (long long i = 1; i <= ans; i++)
            if (ans % i == 0)
                cnt++;
        if (cnt % 2 == 0)
            n--;
    }
    cout << ans;
    return 0;
}

小元一看最大的数据范围:10的15次方,这一秒时限不是妥妥的超时了吗!
请你想办法优化这段代码,提交一个输出和这个代码一样,但不会超时的代码。


by Diary_Of_Young @ 2024-11-01 22:23:37

不加注释的吗?


by Diary_Of_Young @ 2024-11-01 22:29:15

如果要判断偶数的话,可以用因数个数定理吧, O(n*sqrt(n))的级别

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

// 计算一个数的因数个数
int countFactors(long long n) {
    int count = 0;
    long long sqrtN = sqrt(n);
    for (long long i = 1; i <= sqrtN; i++) {
        if (n % i == 0) {
            count += 2;
            if (i * i == n) {
                count--;
            }
        }
    }
    return count;
}

int main() {
    long long n;
    cin >> n;
    long long ans = 1;
    while (n > 0) {
        int factors = countFactors(ans);
        if (factors % 2 == 0) {
            n--;
        }
        ans++;
    }
    cout << ans - 1;
    return 0;
}

|