c++筛选素数代码的无法通过:时间超限、运行出错。


#include<bits/stdc++.h>
using namespace std;
int main() {
    int n,i,j;
    cin>>n;
    cout<<2<<endl;
    for(i=3;i<=sqrt(n);i++){
        int flag=1;
        for(int j=2;j<=sqrt(i);j++){
            if(i%j==0){
                flag=0;
                break;
            }
        } 
        if(flag==1)
        {
            cout<<i<<endl;
        }
    }
    return 0;
}

img

你没有用筛法,你用的还是穷举,代码不优化,用筛法看看。

埃氏筛法:

#include<bits/stdc++.h>
using namespace std;
int n;
bool prime[1000010];
void choose_prime(){
    prime[1] = 0;
    for(int i = 2; i <= n; i++){
        if(!prime[i]) continue;
        for(int j = i + i; j <= n; j += i){
            prime[j] = 0;
        }
    }
}
int main(){
    cin >> n;
    memset(prime, 1, sizeof(prime));
    choose_prime();
    for(int i = 1; i <= n; i++){
        if(prime[i]) cout << i << endl;
    }
    return 0;
}

这段代码实现了使用筛法(Sieve of Eratosthenes)来筛选素数的功能。但是,这段代码存在一些问题,可能导致无法通过测试。

  1. 时间超限:由于筛法的时间复杂度较高,当输入的数字较大时,程序可能会超时而无法通过测试。可以考虑使用更高效的算法来实现素数筛选功能。

  2. 运行出错:由于该代码使用了较老的 C++ 标准库中的头文件和函数,可能会在某些编译器或环境下出现错误。可以考虑使用更现代的 C++ 标准库,并对代码进行适当的修改以确保其正确性。

以下是使用更高效的筛素数算法实现的示例代码:

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

int main() {
    int n, i;
    cin >> n;
    vector<bool> isPrime(n + 1, true); // 标记所有数是否为素数
    isPrime[0] = isPrime[1] = false; // 0 和 1 不是素数

    for (i = 2; i <= n; i++) {
        if (!isPrime[i]) { // 如果 i 不是素数
            for (int j = 2; j <= sqrt(i); j++) { // 枚举 i 的因子 j
                if (i % j == 0) {
                    isPrime[i] = false; // 将 i 标记为非素数
                    break;
                }
            }
        }
    }

    for (i = 2; i <= n; ) {
        if (isPrime[i]) { // 如果 i 是素数
            cout << i << endl; // 输出 i
            i++;
        }
    }

    return 0;
}

该代码使用了 vector 来存储每个数是否为素数,并使用了更现代的 C++ 标准库。同时,使用了更高效的筛素数算法来筛选素数,可以在较短的时间内完成筛选。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^