我正在努力提高C#技能,在此过程中,我试图解决Project Euler上的一些问题,在本例中为问题50。问题指出:
素数41,可以写为六个连续素数之和:
41 = 2 + 3 + 5 + 7 + 11 + 13 这是连续素数的最长总和,加到低于1的素数上, 一百。
小于1000的连续素数的最长总和 一个素数,包含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循环内部可能会损坏某些东西,例如我可能从列表中删除了错误的值。如果有人可以提供我的程序为什么不起作用的见解,我将非常感谢。
答案 0 :(得分:2)
找到总数小于1000000的最长质数列表。该列表从2开始并尽可能高。令此列表的长度为L。
现在,迭代总和小于1000000的所有列表,从长度为L的列表开始,然后是长度为L-1的所有列表,然后是L-2,等等。
获得质数总和时停止。
在接近1000000的整数中,每15个整数中大约有1个是素数,因此您不必检查很多列表,当然,您应该通过在末端添加和删除素数来形成后续列表,而不用重新计算总和。
答案 1 :(得分:0)
好吧,我正在提高自己的python技能并使用python解决了这个问题。我认为这个问题可能是错误的,并且我手动进行了计算。这是我的答案
素数41可以写为六个连续素数之和:41 = 2 + 3 + 5 + 7 + 11 + 13
这是连续质数的最长总和,加成小于一百的质数。最长的
一千个以下的连续素数的最长总和加上一个素数,包含21个项,等于953。
哪一个小于100万的素数可以写为最连续的素数之和?
解决方案:- 我试图逐步解决此问题,这是我对自己的假设的证明。
g_signal_connect
加到100以下的素数的连续素数的最长和为41 enter image description here 所以类似地,我将限制从100更改为1000,如下所示。
import sympy
sum=0
lst1=[]
for num in range(1,100):
#isprime(n):return True when the num is prime and false when the num is composite
if sympy.isprime(num) is True:
sum+=num
lst1.append(sum)
print("The sum list 1 is: ",lst1)
lst2=[]
for sum in lst1:
if sum<100:
if sympy.isprime(sum)==True:
lst2.append(sum)
print("The list 2 is: ",lst2)
print("The required answer is :",max(lst2))
enter image description here 这里的答案有所不同,最高的分数是281,而我提到的953是实际答案。 只需将上限从 1000更改为1000000 ,我们就会得到 958577 的答案 enter image description here
解释:当您手动加法时,您将得到963而不是953,这使963成为了一个复合数字。因此,我认为此问题有误,也许开发人员给出了错误的答案或