eratosthenes的筛子不能使用C ++

时间:2016-09-18 10:50:55

标签: c++ primes

所以我试图制作一个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,因为它在主类之外。

3 个答案:

答案 0 :(得分:1)

很简单。我们有一些小问题:

  1. 0两个以上的除数,所以它不是素数
  2. 1只有一个除数,所以它不是素数
  3. 2是唯一的偶数是素数
  4. 所以,基本上我们不应该计算偶数。我们只对奇数感兴趣。

    我们将所有非素数标记为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)

您的代码存在许多问题。

  1. int A[1000000];

    您尚未初始化阵列。 您应该将A[0]=1A[1]=1和所有其他索引初始化为0

  2. for(int j = i*i; j < till; j+=i)

    i*i可能导致整数溢出。您应该使用j=i+i来减少溢出的可能性。

  3. 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);
}