我正在使用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;
}
答案 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;
}