欧拉项目27题答错了

Getting wrong answer for Project Euler #27

本文关键字:错了 项目      更新时间:2023-10-16

我正在用c++做Project euler# 27:

欧拉发表了非凡的二次公式:

n²+ n + 41

结果表明,该公式将产生40个质数连续取值n = 0 ~ 39。然而,当n = 40时,40²+ 40 + 41 =40(40 + 1) + 41能被41整除,当然当n = 41 41²+41 + 41能被41整除。

使用计算机,令人难以置信的公式n²−79n + 1601是n = 0的连续值产生80个素数到79年。系数- 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 = 0开始的n值

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

#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;
}

您允许a为负,并且您的formula返回int。用负数调用Helper::isPrime有意义吗(换句话说,Helper::isPrime接受无符号整型吗?)

这是我的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;
}