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