eratosthenes筛不起作用C++; 我尝试在一个特定的点上生成一个C++程序来生成所有素数,但是由于某种原因,它在2之后将所有的数字作为非素数打印出来。 int A[1000000]; void sieve(int till) { for(int i = 2; i < till; i++) { if(A[i] == 0) { for(int j = i*i; j < till; j+=i) { A[j - 1] = 1; //printf("%i is NOT prime\n", ij); } } } }
但当我尝试调试时,它会说:eratosthenes筛不起作用C++; 我尝试在一个特定的点上生成一个C++程序来生成所有素数,但是由于某种原因,它在2之后将所有的数字作为非素数打印出来。 int A[1000000]; void sieve(int till) { for(int i = 2; i < till; i++) { if(A[i] == 0) { for(int j = i*i; j < till; j+=i) { A[j - 1] = 1; //printf("%i is NOT prime\n", ij); } } } },c++,primes,C++,Primes,但当我尝试调试时,它会说: NOT PRIME 0 NOT PRIME 1 NOT PRIME 2 PRIME 3 NOT PRIME 4 PRIME 5 NOT PRIME 6 PRIME 7 NOT PRIME 8 PRIME 9 NOT PRIME 10 PRIME 11 NOT PRIME 12 NOT PRIME 13 谁知道我做错了什么 编辑:由于A int表在主类之外,它会自动初始化为0s。您的代码存在许多问题 inta[1000000] 您尚未初始化数组。 您应该将A[0]=1
NOT PRIME 0
NOT PRIME 1
NOT PRIME 2
PRIME 3
NOT PRIME 4
PRIME 5
NOT PRIME 6
PRIME 7
NOT PRIME 8
PRIME 9
NOT PRIME 10
PRIME 11
NOT PRIME 12
NOT PRIME 13
谁知道我做错了什么
编辑:由于A int表在主类之外,它会自动初始化为0s。您的代码存在许多问题
inta[1000000]代码>
您尚未初始化数组。
您应该将A[0]=1
、A[1]=1
和所有其他索引初始化为0
for(int j=i*i;j
i*i
可能导致整数溢出。您可能应该使用j=i+i
来减少溢出的机会
A[j-1]=1代码>
不确定是否使用了正确的数组索引
A[j - 1] = 1;
应该是:
A[j] = 1;
因此,现在应该可以很好地工作:
#include<stdio.h>
int A[1000000];
void sieve(int till)
{
for(int i = 2; i < till; i++)
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=i)
{
A[j] = 1;
}
}
}
}
int main()
{
int N,i;
scanf("%i", &N);
for (i = 0;i < N;i++)
A[i] = 0;
sieve(N);
for (i = 2;i < N;i++)
if (A[i])
printf("%i is not prime\n",i);
else
printf("%i is prime\n",i);
}
#包括
INTA[1000000];
空隙筛(整修)
{
for(int i=2;i
非常简单。我们有几个小案例:
int A[1000000];
void sieve(int till)
{
// mark all even numbers (except 2) as not prime
for(int i = 4; i < till; i += 2)
{
A[i] = 1;
}
// now calculate not primes for only odd numbers
for(int i = 3; i < till; i += 2 )
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=(i+i))
{
A[j] = 1;
}
}
}
}
int main()
{
int N;
scanf("%i", &N);
sieve(N);
for(int i = 2; i < N; i++)
{
if(A[i] == 1) printf("%d is not prime\n", i);
else printf("%d is prime\n", i);
}
return 0;
}
inta[1000000];
空隙筛(整修)
{
//将所有偶数(2除外)标记为非素数
对于(int i=4;i
inta[1000000]
这是在任何地方初始化的吗?谢谢!它现在可以工作了,我不知道为什么我真的把-1放在那里。I*I
可能会溢出,但它会在j
条件下被捕获。@PromeNabid不,它不会被捕获。如果i
溢出,则未定义。假设j
获取值-10
<代码>吉现在知道了。它是整数溢出。
int A[1000000];
void sieve(int till)
{
// mark all even numbers (except 2) as not prime
for(int i = 4; i < till; i += 2)
{
A[i] = 1;
}
// now calculate not primes for only odd numbers
for(int i = 3; i < till; i += 2 )
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=(i+i))
{
A[j] = 1;
}
}
}
}
int main()
{
int N;
scanf("%i", &N);
sieve(N);
for(int i = 2; i < N; i++)
{
if(A[i] == 1) printf("%d is not prime\n", i);
else printf("%d is prime\n", i);
}
return 0;
}