/** * non ha senso ciclare da 1 a n nei cicli. * mi fermo al */ public class SommaDiDueCubiLimitato { public static void main(String[] args) { if (args.length != 1) { System.out.println("Uso: java SommaDiDueCubi "); return; } long n = Long.parseLong(args[0]); int max = (int) Math.cbrt(n) + 1; // parte intera della radice cubica di n for (int a = 1; a <= max; a++) { long a3 = (long)a * a * a; for (int b = a + 1; b <= max; b++) { long b3 = (long)b * b * b; long sum1 = a3 + b3; if (sum1 > n) { break; // se b aumentasse ancora, sum1 supererebbe n } for (int c = 1; c <= max; c++) { long c3 = (long)c * c * c; for (int d = c + 1; d <= max; d++) { long d3 = (long)d * d * d; // Evita che le combinazioni siano le stesse (a,b) = (c,d) if ((a == c && b == d) || (a == d && b == c)) continue; long sum2 = c3 + d3; if (sum2 > n) { break; // analogamente, se d cresce sum2 supera n } if (sum1 == sum2) { // Ordina le coppie (a,b) e (c,d) per evitare inversioni if (a < c || (a == c && b < d)) { System.out.println(sum1 + " = " + a + "^3 + " + b + "^3 = " + c + "^3 + " + d + "^3"); } } } } } } } }