我试图重复寻找有关欧拉猜想的反例。我需要找到五个数字,例如a1^5+a2^5+3^5+a4^5 =a5^5
。最小的反例是27 ^ 5 + 84 ^ 5 + 110 ^ 5 + 133 ^ 5 = 144 ^ 5。我认为我正在遍历每个数字,并确保数字是有序的,但是,我没有得到预期的结果。请指出我的错误。
public class Euler {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int a1 = 1; //greatest
int a2 = 1;
int a3 = 1;
int a4 = 1;
boolean solved = false;
while (!solved) {
if (a3 >= a4) { //major progress!!!
System.out.println("values are " + a1 + " " + a2 + " " + a3 + " " + a4 + " " + solved);
a4++;
a3 = 1;
a2 = 1;
a1 = 1;
}else if(a2 >= a3) {
a3++;
a2 = 1;
a1 = 1;
} else if(a1 >= a2) {
a2++;
a1 = 1;
}
solved = antiEuler(a1, a2, a3, a4);//Check conjencture
a1++;
}
}
public static boolean antiEuler(int a1, int a2, int a3, int a4) {//
double a5 = Math.pow(Math.sqrt(Math.pow(a1, 5) + Math.pow(a2, 5) + Math.pow(a3, 5) + Math.pow(a4, 5)), 0.2);
double a6 = Math.floor(a5);
if (a6 == a5) {
System.out.println("Done!");
System.out.println(a1+" "+a2+" "+a3 +" "+a4+" "+a5);
return true;
} else {
return false;
}
}
}
最佳答案
该程序存在几个问题。
首先,最小的示例包含大于6 * 1010的1445,因此int将不起作用。你应该用久
其次,您应该比较整数,而不是它们的根,以免遇到差错。该程序找到第一个示例。
public class Euler {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
long a1 = 1; //smallest
long a2 = 1;
long a3 = 1;
long a4 = 1; //greatest
boolean isSolved = false;
double a6 = 0;
double a7 = 0;
long a8 = 0;
double a9 = 0;
while (!isSolved) {
a1++;
if (a1 > a2) {
a2++;
a1 = 1;
}
if (a2 > a3) {
a3++;
a2 = 1;
a1 = 1;
}
if (a3 > a4) {
//System.out.println(a4 + " " + isSolved);
a4++;
a3 = 1;
a2 = 1;
a1 = 1;
}
a6 = Math.pow(a1, 5) + Math.pow(a2, 5) + Math.pow(a3, 5) + Math.pow(a4, 5);
a7 = Math.pow(a6, 0.2);
a8 = (long) a7;
a9 = Math.pow(a8, 5);
if (a6 == a9) {
isSolved = true;
System.out.println(a1 + " " + a2 + " " + a3 + " " + a4 + " " + a8);
}
}
}
}