日期:2014-05-20  浏览次数:20751 次

猜算式
看下面的算式:

□□ 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);
            }
        }
    }

}