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

img

img

这段代码实现了使用筛法(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++ 标准库。同时,使用了更高效的筛素数算法来筛选素数,可以在较短的时间内完成筛选。

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

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

您好,我和您的代码思路不太一样,但是十分容易理解,这是一种最朴素的筛质数的方法:

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

bool isPrime(int x)
{
    if(x<=1) return false;
    if(x==2) return true;
    for(int i=2;i*i<x;i++)
    {
        if(x%i==0) return false;
    } 
    return true;
}

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(isPrime(i)) cout<<i<<endl;
    }
    return 0;
}
 

希望我的回答能够帮到您。