所以我正在尝试项目euler的问题50。 (接近第2级:D)它是这样的:
素数41,可以写成六个连续素数的总和:
41 = 2 + 3 + 5 + 7 + 11 + 13
这是连续素数的最长总和,它增加到低于一百的素数。 低于一千的连续素数的最长和加上一个素数,包含21个项,并且等于953。 哪个素数低于一百万,可以写成最连续素数的总和?
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> primes(1000000,true);
primes[0]=false;
primes[1]=false;
for (int n=4;n<1000000;n+=2)
primes[n]=false;
for (int n=3;n<1000000;n+=2){
if (primes[n]==true){
for (int b=n*2;b<100000;b+=n)
primes[b]=false;
}
}
int basicmax,basiccount=1,currentcount,biggermax,biggercount=1,sum=0,basicstart,basicend,biggerstart,biggerend;
int limit=1000000;
for (int start=2;start<limit;start++){
//cout<<start;
sum=0;
currentcount=0;
for (int basic=start;start<limit&&sum+basic<limit;basic++){
if (primes[basic]==true){
//cout<<basic<<endl;
sum+=basic;currentcount++;}
if (primes[sum]&¤tcount>basiccount&&sum<limit)
{basicmax=sum;basiccount=currentcount;basicstart=start;basicend=basic;}
}
if (basiccount>biggercount)
{biggercount=basiccount;biggermax=basicmax;biggerend=basicend;biggerstart=basicstart;}
}
cout<<biggercount<<endl<<biggermax<<endl;
return 0;
}
基本上它只是创建一个高达1000000的所有质数的向量,然后循环遍历它们找到正确的答案。答案是997651,计数应该是543,但我的程序分别输出997661和546。什么可能是错的?
答案 0 :(得分:2)
看起来你正在构建错误的素数
for (int b=n*2;b<100000;b+=n)
primes[b]=false;
我认为应该是1,000,000而不是100,000。将这个数字重构为常数可能会更好,以确保它始终保持一致。
其余的看起来基本上很好,虽然没有自己测试我不知道我们还能添加什么。有足够的空间提高效率:你做了很多反复扫描范围,例如当prime[start]
为假时,没有必要开始求和,你可以构建第二个仅用于求和的素数的向量等。(项目Euler是否有运行时和内存限制限制?我不记得了)
答案 1 :(得分:0)
你正在以错误的方式思考这个问题。