筛选Eratosthenes输出错误

时间:2014-10-11 05:27:00

标签: c sieve-of-eratosthenes

几天前我开始学习C语言。我使用Sieve of Eratosthenes找到素数时遇到了这个问题。代码编译但没有给出正确的输出。

#include<stdio.h>
#include<math.h>
#define size 100

int main()
{
       int n;
       printf("Enter the value of n\n");
       scanf_s("%d",&n);
       int A[size],i;
       for(i=0;i<n+1;i++)
       {
            A[i]=i;
       }
        A[1]=0;
        for(i=0;i<sqrt((float)n);i++)
        {
            for(int j=0;j<n+1;j++)
            {
                if(A[j]%i==0)A[j]=0;
                else A[j]=j;
            }
        }`
        for(i=0;i<n+1;i++)
        {
            if(A[i]!=0)printf("%d\n",A[i]);
        }
    }

2 个答案:

答案 0 :(得分:0)

一些意见:

  • 您不需要使用其数值初始化每个阵列单元格。您只需要用0或1“标记”单元格。
  • 在:for(i=0;i<sqrt((float)n);i++)中,您需要迭代到n+1,就像在其他循环中一样。
  • 如评论中所述:您从i=0开始,然后if(A[j]%i==0)除以零。
  • 您是否将 Erathosthemes Sieve 的概念与 Primality by trial division 混合在一起?

以下是您的代码的可能更正:

#include<stdio.h>
#include<math.h>
#define size 100

int main() {
       int n;
       printf("Enter the value of n\n");
       scanf_s("%d",&n);

       int A[size], i, j;

       A[0] = 1;   //zero is not prime, mark it with: 1
       A[1] = 1;   //...same for one

       for(i=2; i < n+1; i++)
            A[i] = 0;

        for(i=2; i < sqrt((float) n+1); i++)       //loop from first prime to sqrt(n+1)
            if (A[i] == 0)                         //if is unmarked, is prime, THEN
                for(j = i*i; j < n+1 ; j = j + i)  //mark prime's multiples 
                    A[j] = 1;

        for(i=0; i < n+1 ;i++)                     //now visit each cell, and print the unmarked ones
            if (A[i] == 0)
                 printf("%d\n", i);
}

9的输出:

  

2

     

3

     

5

     

7

答案 1 :(得分:0)

A [j]%i在你的程序中不正确。

我在下面的代码中实现了Erathosthemes筛选 -

#include<stdio.h>

int main()
{
int a[20];
int i,n,j;
n=20;

for(i=0;i<n;i++)
    a[i]=i+1;



for(i=2;i<n/2;i++)
{
    for(j=2;j<=(n/i);j++)
    {
        a[(i*j)-1]=0;
    }


}

for(i=0;i<n;i++)
{
if(a[i]!=0)
    printf(" %d",a[i]);

}

return 0;
}