0

それで、30分間髪を抜いた後、私はこの問題の助けを求めてSOに来ることにしました。

10未満の素数の合計は2+3 + 5 + 7=17です。

200万未満のすべての素数の合計を求めます。

今、私は問題をどのように行うかを知りたくありません-それは簡単です-そして特に答えではありません。コードを実行したときに、コードが正しい答えを表示しない理由を知りたいです(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();
    }
}

に実行するとn <= 10、必要に応じてを出力します17。手作業で計算しやすいものに実行すると、正解が出力されます(n <= 20->など77)。

しかし、これを実行すると、666667333337間違った出力が表示されます。

何か案は?

4

4 に答える 4

1
        Int64 f = 5;
        while (f <= 4) {

ここで何かが足りないのかもしれませんが、これらの 2 行は意味をなさないようです。while上記のコードがループの本体を実行することはないと確信しています。

おそらく、fが の平方根より小さいかどうかを確認するつもりでしたrか?

于 2009-11-25T21:20:11.280 に答える
1

ループで変数 r を使用していません。おそらく f<=r の間ループしたいと思いますか?

于 2009-11-25T21:24:09.913 に答える
1

あなたが探しているものではありませんが、おそらくSieve of Eratosthenes のようなものを使用して素数を生成する必要があります。

于 2009-11-25T21:26:00.297 に答える
0

さらに、既存のテストでは、20 未満の非素数 (2、3 などで割り切れる) をすべてキャッチします。

于 2009-11-25T21:32:41.677 に答える