Project Euler#27的错误答案

时间:2011-07-15 15:34:31

标签: c++

我正在使用C ++中的Project Euler#27:

  欧拉发表了显着的二次公式:

     

n²+ n + 41

     

事实证明,该公式将产生40个素数   连续值n = 0到39.但是,当n = 40时,40 + 40 + 41 =   40(40 + 1)+ 41可被41整除,当然n = 41时,41 + 2   41 + 41显然可以被41整除。

     

使用电脑,令人难以置信的公式n² - 79n + 1601   发现,它为连续值n = 0产生80个素数   系数的乘积-79和1601是-126479。

     

考虑形式的二次方:

n² + an + b, where |a| < 1000 and |b| < 1000

where |n| is the modulus/absolute value of n
e.g. |11| = 11 and |−4| = 4
     

找到二次系数的乘积a和b的乘积   表达式,它产生连续的最大素数   n的值,从n = 0开始。

当真正的答案是-59231时,我一直得到-60939。我错过了什么?

#include <iostream>
#include "Helper.h"
using namespace std;

int formula(int a, int b, int n) {
    return ((n * n) + (a * n) + b);
}

int main() {
    int most = 0;
    int ansA = 0;
    int ansB = 0;
    bool end = false;

    for(int a = 999; a >= -999; a--) {
        for(int b = 999; b >= 2; b--) { //b must be prime
            if(Helper::isPrime(b)) {
                end = false;
                for(int n = 0; !end; n++) {
                    if(!Helper::isPrime(formula(a, b, n))) {
                        if(n-1 > most) {
                            most = n-1;
                            ansA = a;
                            ansB = b;
                        }
                        end = true;
                    }
                }
            }
        }
    }
    cout << ansA << " * " << ansB << " = " << ansA * ansB << " with " << most << " primes." << endl;
    return 0;
}

如果是问题,这是我的isPrime函数:

bool Helper::isPrime(int num) {
    if(num == 2)
        return true;

    if(num % 2 == 0 || num == 1 || num == 0)
        return false;

    int root = (int) sqrt((double)num) + 1;
    for(int i = root; i >= 2; i--) {
        if (num % i == 0)
            return false;
    }
    return true;
}

2 个答案:

答案 0 :(得分:4)

您允许a为负数,而您的formula返回int。使用负数调用Helper :: isPrime是否有意义(换句话说,Helper :: isPrime是否采用无符号整数?)

答案 1 :(得分:0)

这是我的java版本。希望它有所帮助:

static int function(int n, int a, int b){
    return n*n + a*n + b;
}
static int consequitive_Primes(int a, int b, HashSet<Integer> primes){
    int n = 0;
    int number = 0;
    while(true){
        if(!primes.contains(function(n, a, b)))
            break;
        number++;
        n++;
    }
    return number;
}
static HashSet<Integer> primes (int n){
    ArrayList<Integer> primes = new ArrayList<Integer>();
    primes.add(3);
    for(int i=3; i<n;i+=2){
        boolean isPrime = true;
        for(Integer k:primes){
            if(i%k==0){
                isPrime = false;
                break;
            }
        }
        if(isPrime) primes.add(i);
    }
    return new HashSet<Integer>(primes);
}
static long q27(){
    HashSet<Integer> primes = primes(1000);
    int max = 0;
    int max_ab = 0;
    for(int a = -999; a<1000;a++){
        for(int b = -999; b<1000;b++){
            int prime_No = consequitive_Primes(a,b,primes);
            if(max<prime_No){
                max = prime_No;
                max_ab = a*b;
            }
        }
    }
    return max_ab;
}