/*
 * @(#) E2008.java
 * Created on 2004-10-9
 * Created by James Fancy
 */
package jamesfancy;import java.util.Arrays;/**
 * @author James Fancy
 */
public final class E2008 {    private int[] data;
    private boolean[] used;
    private int[] selected;
    private int count;    public E2008() {
        data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        used = new boolean[data.length];
        Arrays.fill(used, false);
        count = 10;
        selected = new int[count];
    }    private void found() {
        long top = ((long) selected[0]) * 10000 + selected[1] * 1000
                + selected[2] * 100 + selected[3] * 10 + selected[4];
        long bottom = ((long) selected[5]) * 10000 + selected[6] * 1000
                + selected[7] * 100 + selected[8] * 10 + selected[9];
        if (top + 20085 == bottom) {
            for (int i = 0; i < count; ++i) {
                System.out.print(selected[i]);
                System.out.print(", ");
            }
            System.out.println();
        }    }    public void permute() {
        permute(0);
    }    private void permute(int n) {
        if (n < count) {
            for (int i = 0; i < data.length; ++i) {
                if (!used[i]) {
                    selected[n] = data[i];
                    used[i] = true;
                    permute(n + 1);
                    used[i] = false;
                }
            }
        } else {
            found();
        }
    }    public static void main(String[] args) {
        E2008 e2008 = new E2008();
        e2008.permute();
    }}

解决方案 »

  1.   

    把打印部分稍稍改了一下    private void found() {
            long top = ((long) selected[0]) * 10000 + selected[1] * 1000
                    + selected[2] * 100 + selected[3] * 10 + selected[4];
            long bottom = ((long) selected[5]) * 10000 + selected[6] * 1000
                    + selected[7] * 100 + selected[8] * 10 + selected[9];
            if (top + 20085 == bottom) {
                System.out.println(" " + top);
                System.out.println(" 20085");
                System.out.println("+-----");
                System.out.println(" " + bottom);
                System.out.println();
            }    }结果有如下一些: 14982
     20085
    +-----
     35067 27951
     20085
    +-----
     48036 37941
     20085
    +-----
     58026 41973
     20085
    +-----
     62058 51963
     20085
    +-----
     72048 64932
     20085
    +-----
     85017
      

  2.   

    如 treeroot(根根) 所说,上面第3个数字一定是 9,下面第3个数字一定是 0,所以算法上还可以优化一些,去掉对9和0的全排列