Somme des nombres premiers, Conundrum
Question
Alors, après avoir tiré les cheveux pendant 30 minutes, j'ai décidé de venir à SO pour une aide sur ce problème:
La somme des nombres premiers est inférieur à 10 2 + 3 + 5 + 7 = 17.
Trouvez la somme de tous les nombres premiers inférieurs deux millions.
Maintenant, je ne veux pas savoir comment pour faire le problème - c'est facile - et surtout pas la réponse. Je voudrais savoir pourquoi mon code ne me donne pas la bonne réponse quand je le lance (C #):
using System;
using System.Collections.Generic;
public class Euler010 {
public static bool isPrime(Int64 n) {
if (n <= 1)
return false;
if (n < 4)
return true;
if (n % 2 == 0)
return false;
if (n < 9)
return true;
if (n % 3 == 0)
return false;
Int64 r = (Int64)Math.Floor(Math.Sqrt((double)n));
Int64 f = 5;
while (f <= 4) {
if (n % f == 0)
return false;
if (n % (f + 2) == 0)
return false;
f += 6;
}
return true;
}
public static void Main() {
Int64 sum = 2;
for (Int64 n = 3; n <= 2000000; n+=2) {
if (isPrime(n)) {
sum += n;
}
}
Console.WriteLine(sum);
Console.ReadLine();
}
}
Lors de l'exécution de n <= 10
, il émet 17
, comme il se doit. Lorsqu'il est exécuté à tout ce qui est facile à calculer à la main, il affiche la bonne réponse (comme n <= 20
-> 77
).
Cependant, quand je lance cela, il émet 666667333337
ce qui est faux.
Toutes les idées?
La solution
Int64 f = 5;
while (f <= 4) {
Peut-être que je manque quelque chose ici, mais ces deux lignes ne semblent pas avoir un sens. Je suis assez certain que le code affiché ci-dessus ne sera jamais exécuter le corps de la boucle de while
.
Peut-être que vous vouliez dire vérifier si f
est inférieure à la racine carrée de r
?
Autres conseils
Vous n'êtes pas en utilisant la variable r dans votre boucle, je suppose que vous voulez probablement boucle while f <= r?
Pas ce que vous cherchez, mais vous devriez probablement utiliser quelque chose comme Eratosthène de Sieve pour générer vos nombres premiers.
De plus, les tests existants attraper tous les non-nombres premiers inférieurs à 20 (divisible par 2, 3, etc.).