寻找连续素数之和

时间:2018-07-20 17:51:00

标签: c# algorithm primes

我正在努力提高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循环内部可能会损坏某些东西,例如我可能从列表中删除了错误的值。如果有人可以提供我的程序为什么不起作用的见解,我将非常感谢。

2 个答案:

答案 0 :(得分:2)

  1. 找到总数小于1000000的最长质数列表。该列表从2开始并尽可能高。令此列表的长度为L。

  2. 现在,迭代总和小于1000000的所有列表,从长度为L的列表开始,然后是长度为L-1的所有列表,然后是L-2,等等。

  3. 获得质数总和时停止。

在接近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成为了一个复合数字。因此,我认为此问题有误,也许开发人员给出了错误的答案或