0

所以在拔掉头发 30 分钟后,我决定来 SO 寻求帮助:

10以下的素数之和为2 + 3 + 5 + 7 = 17。

求两百万以下的所有素数之和。

现在,我不想知道如何解决这个问题——这很容易——尤其是答案。我想知道为什么我的代码在运行时没有给我正确的答案(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) {

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

也许您的意思是检查是否f小于 的平方根r

于 2009-11-25T21:20:11.280 回答
1

您没有在循环中使用变量 r,我假设您可能想在 f<=r?

于 2009-11-25T21:24:09.913 回答
1

不是你要找的东西,但你可能应该使用像埃拉托色尼筛子这样的东西来生成你的素数。

于 2009-11-25T21:26:00.297 回答
0

加上现有的测试捕获所有低于 20 的非素数(可被 2、3 等整除)。

于 2009-11-25T21:32:41.677 回答