2017-01-26 1 views
-1

Kann mir bitte jemand sagen, warum mein Programm alle Primzahlen bis zur Eingabe n ausgibt und auch nur die Nummer n+2 (ob prime oder nicht)? Und manchmal auch n+1, wenn es prim ist, z.B. Für die Eingabe n=10 ist die Ausgabe 2,3,5,7,11,12.C-Code für Sieb von Erasthenes

ist hier mein Code:

/*Write a program that reads in a number n between 1 and 100,000 and then lists all the prime numbers between 1 and n inclusive.*/ 

#include 

#define LIMIT 100000 /*size of integers array*/ 
#define PRIMES 100000 /*size of primes array*/ 

int main(){ 
    int i,j,numbers[LIMIT]; 
    int primes[PRIMES]; 
    int n, count; 
    count = 0; 

    /*Read in an upper limit, n*/ 
    printf("Please enter a value for n: "); 
    if (scanf("%d", &n) !=1) { 
     printf("Sorry, cannot read n.\n"); 
     return 1; 
    } 

    /*fill the array with natural numbers*/ 
    for (i=0;i<=n;i++){ 
     numbers[i]=i+2; 
    } 

    /*sieve the non-primes*/ 
    for (i=0;i<=n;i++){ 
     if (numbers[i]!=-1){ 
      for (j=2*numbers[i]-2;j<n;j+=numbers[i]) 
       numbers[j]=-1; 
     } 
    } 

    /*transfer the primes to their own array*/ 
    j = 0; 
    for (i=0;i<=n&&j<PRIMES;i++) 
     if (numbers[i]!=-1) { 
      primes[j++] = numbers[i]; 
      count = count + 1; } 

    /*print*/ 
    for (i=0;i<count;i++) 
     printf("%d\n",primes[i]); 

    return 0; 
} 
+3

Willkommen bei Stack-Überlauf! Es klingt, als müssten Sie lernen, wie Sie einen [Debugger] (https://en.wikipedia.org/wiki/Debugger) verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

Es hat Bias ('Zahlen [i] = i + 2;'). – BLUEPIXY

Antwort

0

Sie immer n setzen + 1 und n + 2 in Ihren Zahlen Array,

for (i=0;i<=n;i++){ 
    numbers[i]=i+2; 
} 

Für i in {n-1, n}.

Aber Sie sie nicht herausfiltern, Da dieser Schleife:

for (i=0;i<=n;i++){ 
    if (numbers[i]!=-1){ 
     for (j=2*numbers[i]-2;j<n;j+=numbers[i]) 
      numbers[j]=-1; 
    } 
} 

Ignoriert die Zahlen, die als n größer sind.

Eine Arbeitsversion:

#define MAX_SIZE 100000 /*size of integers array*/ 

int main() { 
    unsigned int i; 
    unsigned int j; 
    unsigned int max_filled_index; 
    unsigned int numbers[MAX_SIZE]; 
    unsigned int primes[MAX_SIZE]; 
    unsigned int num_to_sieve; 
    unsigned int prime_count = 0; 

    /*Read in an upper limit, n*/ 
    printf("Please enter a value for n: "); 
    if (scanf("%d", &num_to_sieve) != 1) { 
     printf("Sorry, cannot read n.\n"); 
     return 1; 
    } 

    max_filled_index = num_to_sieve - 2; 
    /*fill the array with natural numbers*/ 
    for (i = 0; i <= max_filled_index; i++) { 
     numbers[i] = i + 2; 
    } 


    /*sieve the non-primes*/ 
    for (i = 0; i <= max_filled_index; i++) { 
     if (numbers[i] != 0) { 
      for (j = 2 * numbers[i] - 2; j <= max_filled_index; j += numbers[i]) { 
       numbers[j] = 0; 
      } 
     } 
    } 

    /*transfer the primes to their own array*/ 
    for (i = 0; i <= max_filled_index && prime_count < MAX_SIZE; i++) 
     if (numbers[i] != 0) { 
      primes[prime_count] = numbers[i]; 
      prime_count++; 
     } 

    /*print*/ 
    for (i = 0; i < prime_count; i++) 
     printf("%d\n", primes[i]); 

    return 0; 
} 
+0

Danke, ich habe versucht, diese Schleife zu beiden zu ändern: für (j = 2 * Zahlen [i] -2; j

+0

Ich habe meine Antwort mit einer festen Version des Codes bearbeitet. Das Hauptproblem war die Wiederholung bis n und nicht bis n-2. – Ynon

Verwandte Themen