Question

La question est: Trouver la somme de tous les nombres premiers en dessous de 2 millions

.

Je à peu près a fait le Crible d'Eratosthène chose, et le programme ci-dessous semble travailler pour petit nombre à savoir définir LIMIT comme 10L produit 17 comme réponse.

Je soumettais 1179908154 que la réponse, tel que produit par le programme suivant, et il était incorrect.

S'il vous plaît aider à soulever le problème. Merci.

#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;
}
Était-ce utile?

La solution

Vous calculez les nombres premiers correctement, mais la somme est trop importante (plus de 2 ^ 32) et ne rentre pas dans une longueur de 32 bits non signé. Vous pouvez utiliser un numéro 64 bits (long long sur certains compilateurs) pour résoudre ce problème.

Autres conseils

Votre logique semble être correct, mais vous êtes déconner avec les types de données et leur ranges.Check si cela fonctionne ou non:

#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

Vous trouverez peut-être que vous devez utiliser le commutateur du compilateur std = c99 ainsi. Je l'ai fait avec gcc (GCC) 3.4.5 (MinGW-vista r3 spéciale) .

i.e..

  

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top