【发布时间】:2018-07-20 17:50:59
【问题描述】:
我正在努力提高我的 C# 技能,并在此过程中尝试解决 Project Euler 上的一些问题,在本例中为问题 50。问题说明:
素数41,可以写成六个连续素数之和:
41 = 2 + 3 + 5 + 7 + 11 + 13 这是加到小于一的素数上的最长的连续素数之和 百。
小于一千的连续素数的最长和加到 一个素数,包含 21 项,等于 953。
100 万以下的哪个素数可以写成最 连续素数?
看起来很简单。我写了一个方法来判断某物是否是素数,列出了低于 100 万的素数(这很容易超出我的需要,但我不知道我实际需要多少),然后遍历该列表以找到质数之和。这是我的代码:
public static void Main()
{
IEnumerable<int> primes = Enumerable.Range(0, 1000000)
.Where(i => isPrime(i));
int sum = 0;
List<int> history = new List<int>();
foreach (int bar in primes)
{
if (sum + bar < 1000000)
{
sum += bar;
Console.WriteLine(sum);
history.Add(bar);
}
}
while (!isPrime(sum))
{
sum -= history[history.Count - 1];
history.Remove(history[history.Count - 1]);
}
Console.WriteLine(sum);
Console.ReadLine();
}
public static bool isPrime(int num)
{
if (num <= 1)
{
return false;
}
else if (num == 2)
{
return true;
}
else if (num % 2 == 0)
{
return false;
}
else
{
var boundary = (int)Math.Floor(Math.Sqrt(num));
for (int i = boundary; i > 1; i--)
{
if (num % i == 0)
{
return false;
}
}
return true;
}
}
如果我是正确的,这应该找到我的素数之和高达一百万,然后减去素数,直到总和本身就是一个素数。当我运行它时,代码总和为997661,但这不是素数。我减去最近添加的素数,直到得到958577 的结果,这是素数,但这不是正确的答案。我相当肯定我找到素数的方法是正确的,但我无法弄清楚是什么导致我的答案出错。更糟糕的是,我不知道正确的答案,所以我无法逆向查看导致问题的原因。
我怀疑我的 while 循环内部可能有问题,比如我从列表中删除了错误的值。如果有人能提供一些关于为什么我的程序无法运行的见解,我将非常感激。
【问题讨论】:
-
您假设列表包括 2。谁说它必须以 2 开头?为什么不是3?还是5?它必须是连续的素数。它没有说明它从哪里开始。
-
不是while循环坏了,整个方法都坏了。找到一个长的连续序列,然后将其缩短直到总和为素数,这并不能保证其他一些总和为素数的序列不可能更长。
-
在这种情况下,从素数列表的开头删除值会更好吗?还是我应该放弃整个解决方案并重试?
-
这还不够,但是您可以扩展这些方法来搜索开始和相应的结束,然后它应该可以工作,显然这样会慢很多..