Algs4-2.4.25 计算数论

 2.4.25 计算数论。编写程序CubeSum.java,在不使用额外空间的条件下,按大小顺序打印所有a^3+b^3的结果,其中a和b为0至N之间的整数

。也就是说,不要全部计算N^2个和然后排序,而是创建一个最小优先队列,初始状态为(0^3,0,0),(1^3,1,0),(2^3,2,0),...,(N^3,N,0)。

这样只要优先队列非空,删除并打印最小的元素(i^3+j^3,i,j)。然后如果j<N,插入元素(i^3+(j+1)^3,i,j+1)。用这段程序找出0到10^6之

间所有满足a^3+b^3=c^3+d^3的不同整数a,b,c,d。

答:
第一个编程部分:
1)一个表示i,j,i^3+j^3的类。
2)一个存放上面类的最小优先队列。
3)一个循环用来实始化N个上面的类实例,同时将实例入队。
4)一个循环用来出队,直到队为空。出队后接着一个新实例入队,新实例按题目要求生成。

第二个找出0至10^6的相等立方和数:
用上面的程序将N设置为10^6,然后得到排序结果,在每次出队时检查当前实例的和上一个出队实例,
当两个实例的和相同 并且 上实例.i<>上实例.j<>当前实例.i<>当前实例.j,那么两个实例的i,j就满足题目要求。


这个题的难点应该是题一为什么按这样的算法来做可以满足要求的分析证明过程。
《计算数论》 是算法与数论的另一个分支。


下面是本书官网的代码,它实初始化时用的是矩阵的对角线上的和。


官网代码:
/******************************************************************************
 *  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 10
 *  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<CubeSum> {
    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<CubeSum> pq = new MinPQ<CubeSum>();
        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));
        }
    }

}

原文地址:https://www.cnblogs.com/longjin2018/p/11439982.html