用0~9使等式##*#=#*##=###成立,数字不重复

编写程序,用数字1,2,3,4,5,6,7,8,9代替一下算式中的#,使等式成立。
##*#=#*##=###
要求9个数字都必须用到。

正好前几天用递归解决了遍历m个元素取k个的问题,今天用同样的思路做出了全排列。

每次循环都要开一个新数组,内存开销大。

也可以把九个数字转成StringBuilder,是否内存占用会变小?如果不用递归,应该如何解决呢?

------Output------
29*6=3*58=174
58*3=6*29=174
39*4=2*78=156
78*2=4*39=156

import java.util.*;

public class Equation{
    public static void main(String[] args){
        final int N = 9;
        int[] num = new int[N];
        for(int i = 0; i < N; i++){
            num[i] = i+1;
        }
        rank(num, num.length-1);
    }

    /**
     * 验证算式##*#=#*##=###
     * 一共三个表达式
     */
    public static void confirmEquation(int[] arr){
        int x1 = arr[0]*10+arr[1];
        int x2 = arr[2];
        int x3 = arr[3];
        int x4 = arr[4]*10+arr[5];
        int x5 = arr[6]*100+arr[7]*10+arr[8];
        if(x1*x2 == x5 && x3*x4 == x5){
            System.out.println(x1 + "*" + x2 + "=" + x3 + "*" + x4 + "=" + x5);
        }
    }

    /**
     * 从右向左调整数组元素
     * index为正在排序的最大位索引
     * 由于此处形参是引用传递,为免影响原数组,开一个新数组进行处理
     */
    public static void rank(int[] num, int index){
        int temp;        
        if(index == 0){            
            confirmEquation(num);
        }
        else{
            for(int i = 0; i <= index; i++){ //i=index则不交换
                int[] arr = Arrays.copyOf(num, num.length);
                temp = arr[index];
                arr[index] = arr[i];
                arr[i] = temp;
                rank(arr, index-1);
            }
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2014-12-09 21:04  包清骏  阅读(769)  评论(0编辑  收藏  举报