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?

Était-ce utile?

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.).

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