连续总和

时间:2014-09-06 01:53:49

标签: python primes

我在Project Euler解决了50 th 问题。

问题是:

  

找出低于一百万的素数,这可以写成最连续素数的总和。

例如,41 = 2 + 3 + 5 + 7 + 11 + 13

41是可以写成最连续素数之和的素数。

我写了一个代码,找到1000以下的素数,可以写成最连续素数的总和,检查我的代码是否找到素数(953),这可能是写为1000以下最连续素数的总和。这就是我想出的:

#!/usr/bin/python

import prime

p = prime.genprimes(1000)
prms = [i for i in p]

for prm in prms:
    count = 0
    p = prm
    temp = []
    for a in prms:
        p -= a
        temp.append(a)
        count += 1
        if p == 0:
            print prm, '\t', count, '\t', temp

prime.py

#!/usr/bin/python

def genprimes(limit):
    """
    Returns the prime numbers(generator) until the limit(inclusive) given.
    """

    D = {}
    q = 2

    while q <= limit:
        if q not in D:
            yield q
            D[q * 2] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]
        q += 1

运行代码时的输出:

2       1       [2]
5       2       [2, 3]
17      4       [2, 3, 5, 7]
41      6       [2, 3, 5, 7, 11, 13]    # Longest sum of consecutive primes that adds to a prime below 100
197     12      [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
281     14      [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43]

问题是它没有找到素数953,这是在1000以下加上素数的连续素数的最长和。


因此,我更改了我的代码,以便在prm循环中953for时对其执行的操作进行故障排除:

#!/usr/bin/python

import prime

p = prime.genprimes(1000)

prms = [i for i in p]

found = []

for prm in prms:
    if prm == 953:
        p = prm
        for a in prms:
            print p, '\t', a
            p -= a
            if p < -100:
                break

输出:

953     2
951     3
948     5
943     7
936     11
925     13
912     17
895     19
876     23
853     29
824     31
793     37
756     41
715     43
672     47
625     53
572     59
513     61
452     67
385     71
314     73
241     79
162     83
79      89
-10     97

知道我在这里做错了吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

你的循环总是从索引2开始。连续的素数似乎不一定需要从素数2开始。你需要改变连续加法的起始位置。

答案 1 :(得分:2)

一个较小的例子:如果你找到总和少于10的连续素数的最大和,那么它是3 + 5 = 8,而不是2 + 3 = 5

通过添加从2开始的所有素数,你可能不会(而且不是)总是得到最大的总和。

答案 2 :(得分:0)

  

此问题已在TCS CodeVita 2016中提出

#include<iostream>
using namespace std;
int main(){
        long long int num=0;
        cout<<"Enter the Size to count Prime number till NUM : ";
        cin>>num;
        long long int ary[num],j=2;
        ary[0] =2,ary[1]=3;
        for(int i=2;i<=num;i++){      // loop will add the prime number till num
                if(i%2 != 0 && i%3 != 0){
                    ary[j] = i;
                        j++;
                }
        }
        long long int k,sum=0,count=0;
        cout<<"Sum of Consecutive Prime numbers from "<<2<<" to "<<num<<endl;
        for(int i=0;i<=j;i++){
                for(k=0;k<j;k++){
                        sum+= ary[k];
                        if(sum %2 !=0 && sum%3!=0 && sum<=num){
                                count++;
                            cout<<sum<<endl;
                        }
                }
        }
        cout<<"Total Consecutive Count : "<<count<<endl;
}

<强>输出

  

示例输出1

Enter the Size to count Prime number till NUM : 20
Sum of Consecutive Prime numbers from 2 to 20
5
17
Total Consecutive Count : 2
  

样本输出2

Enter the Size to count Prime number till NUM : 100
Sum of Consecutive Prime numbers from 2 to 100
5
17
41
77
Total Consecutive Count : 4