2010-01-01 8 views
11

La pregunta es: Encuentre la suma de todos los primos por debajo de 2 millones.¿Por qué fallo Project Euler # 10?

Prácticamente hice lo de Sieve of Erastothenes, y el siguiente programa parece funcionar para un número pequeño, es decir, define LÍMITE ya que 10L produce 17 como respuesta.

Presenté 1179908154 como la respuesta, según lo producido por el siguiente programa, y ​​era incorrecto.

Por favor ayuda a identificar el problema. Gracias.

#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

fija mediante la sustitución de largo con largo tiempo, y% lu con% LLU – idazuwaika

+1

Me alegro de corrió en esta pregunta, pasé muchos días frustrados en esto! +1 – DMan

Respuesta

8

a calcular los números primos correctamente, pero la suma es demasiado grande (más de 2^32) y no cabe en un sin signo de 32 bits de longitud. Puede usar un número de 64 bits (long long en algunos compiladores) para solucionar esto.

+0

gracias. Yo simplemente asumí que el tiempo sin firmar ya era demasiado grande para cualquier propósito. tonto me – idazuwaika

+0

Te encontrarás con esto de vez en cuando; hay muchos problemas de Euler con grandes números. A veces puedes hacer trucos inteligentes para evitar el uso de tipos 'long long' o incluso ilimitados; a veces no puedes. – Thomas

1

Su lógica parece ser correcta, pero que están arruinando con los tipos de datos y su ranges.Check si esto funciona 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

También podría encontrar que necesita para usar el compilador switch -std = c99 también. Lo hice con gcc (GCC) 3.4.5 (mingw-vista special r3).

es decir

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

Cuestiones relacionadas