Как вывести переменные из вложенных циклов, используя BigIntegers
Я получаю сумасшедшие ошибки, когда пытаюсь реализовать эту программу, написанную мной, чтобы решить гипотезу Леонарда Эйлера. Ошибка, кажется, в println
, Ты знаешь, что я делаю не так? (Перед запуском программы ошибок нет, появляются сообщения об ошибках). То, что я реализую, довольно просто, поэтому я не совсем уверен, почему он не взаимодействует.
PS Я читал на другом сайте, чтобы назначить исходящее сообщение как объект String и напечатать этот объект String, но это просто добавляет еще одно сообщение об ошибке в список.
public static void main(String[] args) {
BigInteger max = new BigInteger("Integer.MAX_VALUE");
// for(int a=0; a<max; a++)
for(BigInteger a=BigInteger.ZERO; a.compareTo(max)<=0; a=a.add(BigInteger.ONE)){
for(BigInteger b=BigInteger.ZERO; b.compareTo(max)<=0; b=b.add(BigInteger.ONE)){
for(BigInteger c=BigInteger.ZERO; c.compareTo(max)<=0; c=c.add(BigInteger.ONE)){
for(BigInteger d=BigInteger.ZERO; d.compareTo(max)<=0; d=d.add(BigInteger.ONE)){
// a^4
a=a.pow(4);
// b^4
b=b.pow(4);
// c^4
c=c.pow(4);
// d^4
d=d.pow(4);
// a+b+c
BigInteger sum = new BigInteger("a.add(b).add(c)");
// if( sum == d^4 )
int euler = sum.compareTo(d);
if( euler ==0)
{
System.out.println(a+"^4+"+b+"^4+"+c+"^4="+d+"^4");
}
}
}
}
}
}
3 ответа
Две вещи, которые я могу сразу определить, как "вероятно, неправильные".
BigInteger max = new BigInteger("Integer.MAX_VALUE");
Что вы, вероятно, хотите, это:
BigInteger max = BigInteger.valueOf((long)Integer.MAX_VALUE);
А также:
BigInteger sum = new BigInteger("a.add(b).add(c)");
Попробуйте вместо этого:
BigInteger sum = a.add(b).add(c)
@CommuSoft идентифицировал ваши ошибки (поэтому примите его ответ), но я хотел отметить, что вы немного сходите с ума от BigInteger
и что вы выполняете много избыточных вычислений. Безумно много. Это было бы намного эффективнее:
public static void main(String[] args) {
for (int a = -1; a++ < Integer.MAX_VALUE; ) {
BigInteger a4 = BigInteger.valueOf(a).pow(4);
for (int b = a - 1; b++ < Integer.MAX_VALUE; ) {
BigInteger b4 = BigInteger.valueOf(b).pow(4);
BigInteger partialSum = a4.add(b4);
for(int c = b - 1; c++ < Integer.MAX_VALUE; ) {
BigInteger c4 = BigInteger.valueOf(c).pow(4);
BigInteger sum = partialSum.add(c4);
for(int d = c - 1; d++ < Integer.MAX_VALUE; ) {
BigInteger d4 = BigInteger.valueOf(d).pow(4);
int euler = sum.compareTo(d4);
if( euler == 0)
{
System.out.println(a4+"^4+"+b4+"^4+"+c4+"^4="+d4+"^4");
} else if (euler < 0) {
// d4 is larger than the sum, and will only get bigger
break;
}
}
}
}
}
}
Однако даже с этими изменениями я не вижу, чтобы этот код работал до конца в течение вашей жизни. На самом деле, это, вероятно, не завершится в течение всей жизни вселенной.
Я думаю, что проблема больше со строительством sum
:
BigInteger sum = new BigInteger("a.add(b).add(c)");
Java в целом не является интерпретируемым языком: он теряет название переменных.
Также, если вы делаете:
d=d.pow(4);
d
сохранит его значение навсегда (не беру старый после цикла).
Вы также используете:
new BigInteger("Integer.MAX_VALUE");
Что снова не может быть решено, попробуйте:
BigInteger.valueOf(Integer.MAX_VALUE);
Ошибки, вероятно, устраняются с помощью:
BigInteger max = BigInteger.valueOf(Integer.MAX_VALUE);
// for(int a=0; a<max; a++)
for(BigInteger a=BigInteger.ZERO; a.compareTo(max)<=0; a=a.add(BigInteger.ONE)){
for(BigInteger b=BigInteger.ZERO; b.compareTo(max)<=0; b=b.add(BigInteger.ONE)){
for(BigInteger c=BigInteger.ZERO; c.compareTo(max)<=0; c=c.add(BigInteger.ONE)){
for(BigInteger d=BigInteger.ZERO; d.compareTo(max)<=0; d=d.add(BigInteger.ONE)){
// a^4
BigInteger a4=a.pow(4);
// b^4
BigInteger b4=b.pow(4);
// c^4
BigInteger c4=c.pow(4);
// d^4
BigInteger d4=d.pow(4);
// a+b+c
BigInteger sum = a4.add(b4).add(c4);
// if( sum == d^4 )
int euler = sum.compareTo(d4);
if( euler ==0)
{
System.out.println(a+"^4+"+b+"^4+"+c+"^4="+d+"^4");
}
}
}
}
}
Если мы ограничиваем max
в 4
, он генерирует:
0^4+0^4+0^4=0^4
0^4+0^4+1^4=1^4
0^4+0^4+2^4=2^4
0^4+0^4+3^4=3^4
0^4+0^4+4^4=4^4
0^4+1^4+0^4=1^4
0^4+2^4+0^4=2^4
0^4+3^4+0^4=3^4
0^4+4^4+0^4=4^4
1^4+0^4+0^4=1^4
2^4+0^4+0^4=2^4
3^4+0^4+0^4=3^4
4^4+0^4+0^4=4^4
Кроме того, алгоритм, который вы разрабатываете, не очень эффективен. Лучший способ сделать это - установить верхний предел (max
), итерируйте с переменными до этой верхней границы, а затем увеличивайте границу. В противном случае это займет примерно 2^62
до a
установлен в 1
совсем.