我在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
循环中953
为for
时对其执行的操作进行故障排除:
#!/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
知道我在这里做错了吗?谢谢你的帮助。
答案 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