所以我试图制作一个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);
}
}
}
}
在主要的我做:
int N;
scanf("%i", &N);
sieve(N);
但是当我尝试调试它时说:
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表自动初始化为0,因为它在主类之外。
答案 0 :(得分:1)
很简单。我们有一些小问题:
所以,基本上我们不应该计算偶数。我们只对奇数感兴趣。
我们将所有非素数标记为1。
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;
}
答案 1 :(得分:0)
您的代码存在许多问题。
int A[1000000];
您尚未初始化阵列。
您应该将A[0]=1
,A[1]=1
和所有其他索引初始化为0
。
for(int j = i*i; j < till; j+=i)
i*i
可能导致整数溢出。您应该使用j=i+i
来减少溢出的可能性。
A[j - 1] = 1;
不确定您使用的是正确的数组索引。
答案 2 :(得分:0)
这一行:
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);
}