2014-10-11 54 views
1

我幾天前開始學習C語言。我在使用Erathosthemes篩尋找素數時遇到了這個問題。代碼編譯但沒有提供正確的輸出。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

使用調試器。你的'if(A [j]%i == 0)顯然是錯誤的,'i'以'0'開頭。 – 2014-10-11 05:45:51

+0

這不是SoE。 請經過[1]和[2]。 [1] http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Implementation [2] http://rosettacode.org/wiki/Sieve_of_Eratosthenes#C – 2014-10-11 08:09:55

回答

0

一些評論:

  • 你不需要每一個陣列單元,其數值初始化。你只需要用0或1來「標記」單元格。
  • In:for(i=0;i<sqrt((float)n);i++)你需要迭代到n+1,就像你在其他循環中做的那樣。
  • 正如在評論中指出的:你從i=0開始,然後if(A[j]%i==0)除以零。
  • 你是從混合概念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, 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:

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