我的代码适用于 200,000 个质数,但当我尝试 运行 时显示分段错误(核心已转储)2,000,000 个数

My code works for 200,000 prime numbers but shows segmentation error(core dumped) when i try to run it for 2,000,000 numbers

'My code works for 200,000 prime numbers but shows segmentation error(core dumped) when i try to run it for 2,000,000 numbers'

using namespace std;
int main(){
long long n;
cin>>n;
long long prime[n];
for(long long i=0;i<=n;i++){
    prime[i]=1;
}
prime[0]=0;
prime[1]=0;
for(long long i=2;i<=sqrt(n);i++){
for(long long j=2;i*j<=n;j++){
    prime[i*j]=0;
}
}
unsigned long long res=0;
for (long long i = 2; i <= n; ++i){
    if(prime[i]==1){
    res+=i;
    }
}
cout<<res;
}

long long prime[n]; 是可变长度数组,C++ 不支持。一些编译器通过编译器扩展来支持它。内存分配在堆栈上,并且大于堆栈大小。使用std::vector在堆上分配内存。

不要访问 prime[n]。最后一个元素是 prime[n-1].

使用 i * i <= n 代替 i <= sqrt(n)

我建议使用 std::int64_t 而不是 long longlong long 至少有 64 位。 std::int64_t 刚好是 64 位。

#include <iostream>
#include <vector>

int main(){
    std::int64_t n;
    std::cin >> n;
    std::vector<std::int64_t> prime(n);
    for(std::int64_t i = 0; i < n; ++i){
        prime[i] = 1;
    }
    prime[0] = 0;
    prime[1] = 0;
    for(std::int64_t i = 2; i * i <= n; ++i){
        for(std::int64_t j = 2; i * j < n; ++j){
            prime[i * j] = 0;
        }
    }
    std::uint64_t res = 0;
    for (std::int64_t i = 2; i < n; ++i){
        if(prime[i] == 1){
            res += i;
        }
    }
    std::cout << res;
}