素数之和,难题

时间:2009-11-25 21:15:35

标签: c# primes

所以拔掉我的头发30分钟后,我决定来这个问题找一些帮助:

  

低于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 - &gt; 77)。

然而,当我运行它时,它输出666667333337这是错误的。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

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

也许我在这里遗漏了一些东西,但这两行似乎没有意义。我很确定上面发布的代码永远不会执行while循环的主体。

也许您打算检查f是否小于r的平方根?

答案 1 :(得分:1)

你没有在你的循环中使用变量r,我假设你可能想循环而f&lt; = r?

答案 2 :(得分:1)

不是你想要的,但是你应该使用类似Sieve of Eratosthenes之类的东西来生成素数。

答案 3 :(得分:0)

另外,现有的测试会捕获20以下的所有非素数(可被2,3除以等)。