11
votes

Pourquoi je échoue au projet Euler # 10?

question est la suivante: trouvez la somme de tous les nombres premiers inférieurs à 2 millions.

J'ai à peu près le tamis d'Erastothènes, et le programme ci-dessous semble fonctionner pour un petit nombre, c'est-à-dire une limite de définition de 10L.

J'ai soumis 1179908154 comme réponse, telle que produite par le programme suivant, et c'était incorrect.

Aide à l'aide du problème. Merci. xxx


2 commentaires

fixé en remplaçant longtemps avec long long et% LU avec% llu


Je suis content de courir dans cette question, j'ai passé beaucoup de jours frustrés à ce sujet! +1


3 Réponses :


8
votes

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


2 commentaires

Merci. Ya j'ai simplement supposé que longtemps non signé était déjà trop gros pour quelque fin que ce soit. que je suis bête


Vous allez courir dans cela de temps en temps; Il existe de nombreux problèmes d'Euler avec de gros chiffres. Parfois, vous pouvez faire des tondeuses intelligentes pour éviter d'utiliser long long ou même des types illimités; Parfois, vous ne pouvez pas.



1
votes

Votre logique semble être correcte, mais vous vous déconnectez avec les types de données et leurs ganges. Vérifiez 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;
}


0 commentaires

0
votes

Vous pouvez également constater que vous devez utiliser le commutateur compilateur -std = c99 aussi. J'ai fait avec GCC (GCC) 3.4.5 (Mingw-Vista spécial R3) .

I.e.

GCC -Wall -Std = C99 -O Problème10 Problème10.c


0 commentaires