【问题标题】:Sum of primes, Conundrum素数之和,难题
【发布时间】:2009-11-25 21:15:34
【问题描述】:

所以在拔掉头发 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 &lt;= 10 时,它会输出17,就像它应该的那样。当运行任何易于手动计算的东西时,它会输出正确的答案(例如n &lt;= 20 -> 77)。

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

有什么想法吗?

【问题讨论】:

  • 你真的是说“Int64 f=5; while (f
  • 仅供参考,在测试素数时有很多简洁的捷径。我喜欢的是这个——在 2 和 3 之后,您只需要检查具有以下形式的数字:(6n -1) 和 (6n +1),从 n=1 开始。
  • 为什么不直接计算呢?让我们看看,所有整数的和是 n * (n + 1) / 2...减去两个的复合倍数... n(n+1)/(2p)-p...um.... I将剩下的留作练习。 :-)
  • 这是一个有趣的解决方案。非常不同的from mine(on github),我使用sieve of eratosthenes 作为查找所有素数的基础。 Blogged about it here

标签: c# primes


【解决方案1】:
        Int64 f = 5;
        while (f <= 4) {

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不是您要查找的内容,但您可能应该使用 Sieve of Eratosthenes 之类的东西来生成您的素数。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-26
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多