2010-01-01 13 views
11

Frage ist: Finden Sie die Summe aller Primzahlen unter 2 Millionen.Warum schaffe ich Project Euler # 10?

Ich habe so ziemlich die Sieve of Erastothes Sache, und das Programm unten scheint für eine kleine Anzahl zu arbeiten, d. H. Definieren LIMIT als 10L produziert 17 als Antwort.

Ich übermittelte 1179908154 als Antwort, wie von dem folgenden Programm erstellt, und es war falsch.

Bitte helfen Sie, das Problem aufzuzeigen. Vielen Dank.

#include <stdio.h> 

#define LIMIT 2000000L 
int i[LIMIT]; 

int main() 
{ 
    unsigned long int n = 0, k, sum = 0L; 
    for(n = 0; n < LIMIT; n++) 
     i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    unsigned long int p = 2L; 

    while (p*p < LIMIT) 
    { 
     k = 2L; 
     while (p*k < LIMIT) 
     { 
      i[p*k] = 0; 
      k++; 
     } 
     p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
     if (i[n] == 1) 
     { 
      sum += n; 
     } 
    printf("%lu\n",sum); 

    return 0; 
} 
+1

durch Ersetzen lange fixiert mit langen lang und% lu mit% llu – idazuwaika

+1

Ich bin froh, dass ich In dieser Frage lief ich viele frustrierte Tage darauf! +1 – DMan

Antwort

8

Sie berechnen die Primzahlen korrekt, aber die Summe ist zu groß (mehr als 2^32) und nicht in einem unsigned 32-Bit lang passt. Sie können eine 64-Bit-Nummer (long long auf einigen Compilern) verwenden, um dies zu beheben.

+0

danke. ya ich nahm einfach an, dass lang unsigniert für irgendeinen Zweck schon zu groß war. Dumm mich – idazuwaika

+0

Sie werden von Zeit zu Zeit darauf stoßen; Es gibt viele Euler-Probleme mit großen Zahlen. Manchmal können Sie clevere Tricks anwenden, um 'lange lange' oder sogar unbegrenzte Typen zu vermeiden; manchmal kannst du nicht. – Thomas

1

Ihre Logik scheint korrekt zu sein, aber Sie werden mit den Datentypen und deren ranges.Check vermasselt, ob das funktioniert oder nicht:

#include <stdio.h> 

#define LIMIT 2000000 
int i[LIMIT]; 

int main() 
{ 
    long long int n = 0, k, sum = 0; 
    for(n = 0; n < LIMIT; n++) 
    i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    long long int p = 2; 

    while (p*p < LIMIT) 
    { 
    k = 2; 
    while (p*k <LIMIT) 
    { 
     i[p*k] = 0; 
     k++; 
    } 
    p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
    if (i[n] == 1) 
    { 
     sum += n; 
    } 
    printf("%lld\n",sum); 

    return 0; 
} 

Output :142913828922

0

Sie auch vielleicht feststellen, dass Sie brauchen den Compiler-Schalter -std = c99 auch zu verwenden. Ich habe mit gcc (GCC) 3.4.5 (Mingw-Vista spezielle r3).

dh

gcc -Wall -std = c99 -o problem10 problem10.c