【发布时间】:2016-08-14 18:54:03
【问题描述】:
在解决一个在给定范围内查找素数的问题时,我收到一个 Sigsegv 错误,我无法找到我的错误在哪里以及如何纠正它
#include<iostream>
#include<cmath>
using namespace std;
int primes[10000000];// stores prime upto a max value
int prime[10000000];//stores prime in a given range
int main()
{
long long int t,m,n,s,k,q;
for(long long int i=1;i<=1000000;i++){
primes[i]=1;
primes[1]=0;
}
//stores prime using sieve
for(long long int i=2;i<=sqrt(1000000);i++)
{
if(primes[i]==1)
{
for(long long int j=2;i*j<=1000000;j++)
{
primes[i*j]=0;
}
}
}
cin>>t;
while(t--)
{
cin>>m>>n;
//marking all indices as 1
for(long long int i=m;i<=n;i++)
{
prime[i]=1;
}
//calculating which offset to mark
for(long long int i=2;i<=n-m+1;i++)
{
if(primes[i]==1)
{
long long int x=(m/i)*i;
while(x<m)
x=x+i;
for(long long int j=x;j<=n;j=j+i)
{
if(primes[j]==0)
prime[j]=0;
}
}
}
for(long long int i=m;i<=n;i++)
{
if(prime[i]==1&&i!=1)
cout<<i<<"\n";
}
}
return 0;
}
【问题讨论】:
-
你有核心转储吗?
-
在 C++ 中,索引从 0 到 size-1。您至少应该更新您的 for 循环以遵守此规则。
-
@Beginner 您无法使用 : prime[10000000] 访问数组的最后一个元素。您必须使用素数[9999999]。并且第一个元素是 prime[0],而不是 prime[1]
-
@steiner:数组的大小是用于访问它们的最高索引的 10 倍。数零……
标签: c++ primes sieve-of-eratosthenes sieve