【问题标题】:sieve of Eratosthenes output error埃拉托色尼筛法输出误差
【发布时间】:2014-10-11 05:26:59
【问题描述】:

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

#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]);
        }
    }

【问题讨论】:

标签: c sieve-of-eratosthenes


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

    一些cmets:

    • 您不需要使用其数值初始化每个数组单元格。您只需要用 0 或 1 “标记”单元格。
    • 在:for(i=0;i&lt;sqrt((float)n);i++) 中,您需要迭代到 n+1,就像在其他循环中所做的那样。
    • 如 cmets 中所述:您从 i=0 开始,然后 if(A[j]%i==0) 除以零。
    • 您是否将 Sieve of Erathosthemes 的概念与 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多