当前位置: 代码迷 >> Java相关 >> 猜算式,该如何处理
  详细解决方案

猜算式,该如何处理

热度:4041   发布时间:2013-02-25 21:46:02.0
猜算式
看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....

请编程,输出所有可能的情况!

注意:左边的两个乘数交换算同一方案,不要重复输出!

------解决方案--------------------------------------------------------
探讨
Java code

package com.practice;

public class Guess {

/**
* @param args
*/
public static void main(String[] args) {

int[] a=new int[81];
int[] d=ne……

------解决方案--------------------------------------------------------
for example
Java code
import java.util.*;public class Test {    public static void main(String[] args) throws Throwable {        int[] num = {1,2,3,4,5,6,7,8,9};        int[] gp = new int[4];        Set<String> dup = new HashSet<String>();        String key;        for (List<Integer> list : parade(num, num.length)) {            for (int i=1, j=0; i<6; i+=2) {                gp[j++] = list.get(i-1) * 10 + list.get(i);            }            gp[3] = list.get(6)*100 + list.get(7)*10 + list.get(8);            if (gp[0]*gp[1] == gp[2]*gp[3]) {                if (gp[0] > gp[1]) {                    key = String.format("%d * %d", gp[1], gp[0]);                } else {                    key = String.format("%d * %d", gp[0], gp[1]);                }                if (! dup.contains(key)) {                    System.out.printf("%s = %d * %d\n", key, gp[2], gp[3]);                    dup.add(key);                }            }        }    }    public static List<List<Integer>> parade(int[] num, int n) { //排列组合        List<List<Integer>> result = new ArrayList<List<Integer>>();        if (num==null || num.length==0 || n==0) return result;        if (n > num.length) n = num.length;        if (n==1) {            for (int i=0; i<num.length; i++) {                List<Integer> list = new ArrayList<Integer>();                list.add(num[i]);                result.add(list);            }            return result;        }        for (int i=0; i<num.length; i++) {            int[] sub = new int[num.length-1];            for (int j=0, k=0; j<num.length; j++) {                if (j!=i) sub[k++] = num[j];            }            for (List<Integer> list : parade(sub, n-1)) {                list.add(0, num[i]);                result.add(list);            }        }        return result;    }}
------解决方案--------------------------------------------------------
楼上是牛人啊。我在网上找了一个排列组合的例子,我自己都还没看懂呢。先拿过来用,再好好看看
Java code
package com.practice;import java.util.ArrayList;import java.util.List;public class Guess3 {         public static void main(String[] args) {        List<Integer> s=new ArrayList<Integer>();        List<Integer> rs=new ArrayList<Integer>();        for(int i=1;i<=9;i++)            s.add(i);        fun(s,rs);    }            public static void fun(List<Integer > s,List<Integer> rs){                int a,b,c,d;        if(s.size()==1){                        rs.add(s.get(0));             a=10*rs.get(0)+rs.get(1);             b=10*rs.get(2)+rs.get(3);             c=10*rs.get(4)+rs.get(5);             d=100*rs.get(6)+10*rs.get(7)+rs.get(8);                        if(a*b==c*d && a<b)            {                System.out.println(a+"x"+b+"="+c+"x"+d);            }            rs.remove(rs.size()-1);        }else{            for(int i=0;i<s.size();i++){                rs.add(s.get(i));                List<Integer> tmp = new ArrayList<Integer>();                for(Integer ts:s)                    tmp.add(ts);                tmp.remove(i);                fun(tmp,rs);                rs.remove(rs.size()-1);            }        }    }}
  相关解决方案