/****************************************************************************** * Compilation: javac CubeSum.java * Execution: java CubeSum n * Dependencies: MinPQ.java * * Print out integers of the form a^3 + b^3 in sorted order, where * 0 <= a <= b <= n. * * % java CubeSum 12 * 0 = 0^3 + 0^3 * 1 = 0^3 + 1^3 * 2 = 1^3 + 1^3 * 8 = 0^3 + 2^3 * 9 = 1^3 + 2^3 * ... * 1729 = 9^3 + 10^3 * 1729 = 1^3 + 12^3 * ... * 3456 = 12^3 + 12^3 * * Remarks * ------- * - Easily extends to handle sums of the form f(a) + g(b) * - Prints out a sum more than once if it can be obtained * in more than one way, e.g., 1729 = 9^3 + 10^3 = 1^3 + 12^3 * ******************************************************************************/ public class CubeSum implements Comparable { private final int sum; private final int i; private final int j; public CubeSum(int i, int j) { this.sum = i*i*i + j*j*j; this.i = i; this.j = j; } public int compareTo(CubeSum that) { if (this.sum < that.sum) return -1; if (this.sum > that.sum) return +1; return 0; } public String toString() { return sum + " = " + i + "^3" + " + " + j + "^3"; } public static void main(String[] args) { int n = Integer.parseInt(args[0]); // initialize priority queue MinPQ pq = new MinPQ(); for (int i = 0; i <= n; i++) { pq.insert(new CubeSum(i, i)); } // find smallest sum, print it out, and update while (!pq.isEmpty()) { CubeSum s = pq.delMin(); StdOut.println(s); if (s.j < n) pq.insert(new CubeSum(s.i, s.j + 1)); } } }