【问题标题】:Finding sum of consecutive primes求连续素数之和
【发布时间】: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循环坏了,整个方法都坏了。找到一个长的连续序列,然后将其缩短直到总和为素数,这并不能保证其他一些总和为素数的序列不可能更长。
  • 在这种情况下,从素数列表的开头删除值会更好吗?还是我应该放弃整个解决方案并重试?
  • 这还不够,但是您可以扩展这些方法来搜索开始和相应的结束,然后它应该可以工作,显然这样会慢很多..

标签: c# algorithm primes


【解决方案1】:
  1. 找到总和小于 1000000 的最长素数列表。这是从 2 开始并尽可能高的列表。设这个列表的长度为 L。

  2. 现在,遍历总和小于 1000000 的所有列表,从长度为 L 的列表开始,然后是长度为 L-1 的所有列表,然后是 L-2,以此类推。

  3. 当你得到质数时停止。

接近 1000000 的每 15 个整数中大约有 1 个是素数,因此您不必检查很多列表,当然您应该通过添加和删除末尾的素数而不是重新计算整个总和来创建后续列表。

【讨论】:

    【解决方案2】:

    嗯,我正在提高我的 Python 技能并使用 Python 解决了这个问题。我认为这个问题可能是错误的,我手动进行了计算。这是我的答案

    素数 41,可以写成六个连续素数之和:41 = 2 + 3 + 5 + 7 + 11 + 13

    这是与小于 100 的素数相加的最长的连续素数之和。最长的和

    加到一个素数上的小于一千的连续素数的最长和,包含 21 项,等于 953。

    100 万以下的哪个素数可以写成最连续素数之和?

    解决方案:- 我试图一步一步地解决它,这是我对我的假设的理由。

    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))
    

    100 以下的素数加起来最长的连续素数之和是 41 enter image description here 所以类似地,我将限制从 100 更改为 1000,如下所示..

        import sympy
    sum=0
    lst1=[]
    
    for num in range(1,1000):
        #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<1000:
            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 成为一个合数。因此,我认为这个问题有一个错误,也许开发人员给出了错误的答案或所以。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多