输出错误的项目Euler 50

时间:2012-04-18 16:14:42

标签: c++

所以我正在尝试项目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]&&currentcount>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。什么可能是错的?

2 个答案:

答案 0 :(得分:2)

看起来你正在构建错误的素数

        for (int b=n*2;b<100000;b+=n)
            primes[b]=false;

我认为应该是1,000,000而不是100,000。将这个数字重构为常数可能会更好,以确保它始终保持一致。

其余的看起来基本上很好,虽然没有自己测试我不知道我们还能添加什么。有足够的空间提高效率:你做了很多反复扫描范围,例如当prime[start]为假时,没有必要开始求和,你可以构建第二个仅用于求和的素数的向量等。(项目Euler是否有运行时和内存限制限制?我不记得了)

答案 1 :(得分:0)

你正在以错误的方式思考这个问题。

  1. 生成素数的最大序列,使其总和小于1,000,000。这是2,3,5,...,p。对某些人来说
  2. 对此序列求和并测试它的素数。
  3. 如果是素数终止并返还总和。
  4. 较短的序列必须是正确的序列。有两种方法可以缩短序列并保留连续的素数属性 - 删除第一个元素或删除最后一个元素。使用这两个序列从2递归。