2010-01-01 19 views
11

La domanda è: Trova la somma di tutti i numeri primi sotto 2 milioni.Perché non riesco a Project Euler # 10?

Ho praticamente fatto il setaccio di Erastothenes, e il programma seguente sembra funzionare per un numero limitato, quindi definire LIMIT come 10L produce 17 come risposta.

Ho inviato 1179908154 come risposta, come prodotto dal seguente programma, ed era errato.

Si prega di aiuto indicando il problema. Grazie.

#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

fisso sostituendo lungo con lunga lunga, e% lu con% llu – idazuwaika

+1

Sono contento di aver corso in questa domanda, ho trascorso molti giorni frustrati su questo! +1 – DMan

risposta

8

a calcolare i numeri primi in modo corretto, ma la somma è troppo grande (più di 2^32) e non si adatta in una senza segno a 32 bit a lungo. È possibile utilizzare un numero a 64 bit (long long su alcuni compilatori) per risolvere il problema.

+0

grazie. ho semplicemente pensato che il lungo non firmato fosse già troppo grande per qualsiasi scopo. stupido me – idazuwaika

+0

Vi imbatterete di tanto in tanto; ci sono molti problemi di Eulero con grandi numeri. A volte puoi fare astuti stratagemmi per evitare di usare tipi lunghi o addirittura illimitati; a volte non puoi. – Thomas

1

La logica sembra essere corretto, ma si sono in disordine, con i tipi di dati e la loro ranges.Check se questo funziona o no:

#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

si potrebbe anche scoprire che avete bisogno utilizzare l'interruttore del compilatore -std = c99. Ho fatto con gcc (GCC) 3.4.5 (mingw-vista speciale r3).

cioè

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

Problemi correlati