Мой код работает для 200 000 простых чисел, но показывает ошибку сегментации (ядро сброшено), когда я пытаюсь запустить его для 2 000 000 чисел - PullRequest
0 голосов
/ 31 марта 2020

'Мой код работает для 200 000 простых чисел, но показывает ошибку сегментации (ядро сброшено), когда я пытаюсь запустить его для 2 000 000 чисел'

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;
}

1 Ответ

0 голосов
/ 31 марта 2020

long long prime[n]; - массив переменной длины и не поддерживается C ++. Некоторые компиляторы поддерживают его с помощью расширения компилятора. Память выделяется в стеке, и она больше, чем размер стека. Используйте std::vector для выделения памяти в куче.

Не обращайтесь к prime[n]. Последний элемент - prime[n-1].

Используйте i * i <= n вместо i <= sqrt(n).

Я рекомендую использовать std::int64_t вместо long long. long 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;
}
...