我的代码适用于 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 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;
}
'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 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;
}