乘法运算

/*猜算式 
看下面的算式: 
□□ 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 
..... 
请编程,输出所有可能的情况! 
注意: 
左边的两个乘数交换算同一方案,不要重复输出! 
不同方案的输出顺序不重要 
 */  
import java.util.List;  
import java.util.ArrayList;  

public class 乘法运算 {  
    static List<String> lis = new ArrayList<String>();  // 结果1(有重复的结果)  
    static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果) 
    static int kinds = 1;  
    // 是否重复  
    public static boolean isDup(String s1,String s2){  
        String a1 = s1.substring(0,2);  
        String a2 = s1.substring(2,4);  
        String b1 = s2.substring(0,2);  
        String b2 = s2.substring(2,4);  
        if(a1.equals(b2)&&a2.equals(b1)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    // 去除lis重复元素  
    public static void removeDuplicate(){  
        lis2.add(lis.get(0));  
        for(int i=1;i<lis.size();i++){  
            boolean flag=false;    // 标记是否重复  
            for(int j=0;j<lis2.size();j++){  
                flag = isDup(lis.get(i),lis2.get(j));   // 判断是否重复  
                if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据  
            }  
            if(!flag){  
                lis2.add(lis.get(i));   // 不重复,则添加  
                kinds++;
            }  
        }  
    }  
    // 输出  
    public static void print(){  
        for(String s:lis2){  
            String a = s.substring(0,2);  
            String b = s.substring(2,4);  
            String c = s.substring(4,6);  
            String d = s.substring(6);  
            System.out.println(a+" x "+b+" = "+c+" x "+d);  
        }  
    }  
    // 检测结果,符合条件的输出  
    public static void check(int[] n){  
        StringBuffer sb = new StringBuffer();  
        for(int x:n){   // 数字数组转为字符串  
            sb.append(x);  
        }  
        int a = Integer.parseInt(sb.substring(0,2).toString());  
        int b = Integer.parseInt(sb.substring(2,4).toString());  
        int c = Integer.parseInt(sb.substring(4,6).toString());  
        int d = Integer.parseInt(sb.substring(6).toString());  
        if(a*b==c*d){  
            lis.add(sb.toString()); // 添加结果  
        }  
    }  
    // 全排列  
    public static void allSort(int[] n,int start,int end){  
        if(start>=end){  
            check(n);   // 检测结果,符合条件的输出  
            return ;  
        }else{  
            for(int i=start;i<=end;i++){  
                int t = n[start];   // 交换元素  
                n[start] = n[i];  
                n[i] = t;  
                // 递归全排列  
                allSort(n,start+1,end);  
                t = n[start];       // 还原元素  
                n[start] = n[i];  
                n[i] = t;  
            }  
        }  
    }    
    public static void main(String[] args){  
        //fun();  //   
    	int[] n  = {1,2,3,4,5,6,7,8,9};
    	allSort(n,0,n.length-1);
    	removeDuplicate();  // 去除重复元素  
        print();    // 输出结果  
        System.out.println("kinds:"+kinds);
    }  
} 


/*----------------------------------黄金分隔线---------------------------*/
import java.util.List;  
import java.util.ArrayList;  

public class 乘法运算 {  
    static List<String> lis = new ArrayList<String>();  // 结果1(有重复的结果)  
    static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果) 
    static int kinds = 1;
    // 是否重复  
    public static boolean isDup(String s1,String s2){  
        String a1 = s1.substring(0,2);  
        String a2 = s1.substring(2,4);  
        String b1 = s2.substring(0,2);  
        String b2 = s2.substring(2,4);  
        if(a1.equals(b2)&&a2.equals(b1)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    // 去除lis重复元素  
    public static void removeDuplicate(){  
        lis2.add(lis.get(0));  
        for(int i=1;i<lis.size();i++){  
            boolean flag=false;    // 标记是否重复  
            for(int j=0;j<lis2.size();j++){  
                flag = isDup(lis.get(i),lis2.get(j));   // 判断是否重复  
                if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据  
            }  
            if(!flag){  
                lis2.add(lis.get(i));   // 不重复,则添加  
                kinds++;
            }  
        }  
    }  
    // 输出  
    public static void print(){  
        for(String s:lis2){  
            String a = s.substring(0,2);  
            String b = s.substring(2,4);  
            String c = s.substring(4,6);  
            String d = s.substring(6);  
            System.out.println(a+" x "+b+" = "+c+" x "+d);  
        }  
    }  
    // 检测结果,符合条件的输出  
    public static void check(List<Integer> lis1){  
        StringBuffer sb = new StringBuffer();  
        for(int x:lis1){   // 数字数组转为字符串  
            sb.append(x);  
        }  
        int a = Integer.parseInt(sb.substring(0,2).toString());  
        int b = Integer.parseInt(sb.substring(2,4).toString());  
        int c = Integer.parseInt(sb.substring(4,6).toString());  
        int d = Integer.parseInt(sb.substring(6).toString());  
        if(a*b==c*d){  
            lis.add(sb.toString()); // 添加结果  
        }  
    }  
    // 全排列  
    public static void allSort(List<Integer> lis1,int start,int end){  
    	if (start == end) {
			check(lis1);
			return;
		}
		for (int i = 1; i <= 9; i++) {
			if (!lis1.contains(i)) {
				lis1.set(start, i);
			} else {
				continue;
			}
			allSort(lis1, start + 1, end);
			lis1.set(start, 0);
		}
    }  
    public static void main(String[] args){  
    	List<Integer> lis1 = new ArrayList<Integer>();
    	for (int i = 0; i < 9; i++) {
			lis1.add(0); // 初始化为全0
		}
    	allSort(lis1,0,lis1.size());
    	removeDuplicate();  // 去除重复元素  
        print();    // 输出结果  
        System.out.println("kinds:"+kinds);
    }   
} 

/*----------------------------------黄金分隔线---------------------------*/

import java.util.List;  
import java.util.ArrayList;  

public class 乘法运算 {  
    static List<String> lis = new ArrayList<String>();  // 结果1(有重复的结果)  
    static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果) 
    static int kinds = 1;
    static int n[] = new int[9];
	static boolean vis[] = new boolean[10];
    // 是否重复  
    public static boolean isDup(String s1,String s2){  
        String a1 = s1.substring(0,2);  
        String a2 = s1.substring(2,4);  
        String b1 = s2.substring(0,2);  
        String b2 = s2.substring(2,4);  
        if(a1.equals(b2)&&a2.equals(b1)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    // 去除lis重复元素  
    public static void removeDuplicate(){  
        lis2.add(lis.get(0));  
        for(int i=1;i<lis.size();i++){  
            boolean flag=false;    // 标记是否重复  
            for(int j=0;j<lis2.size();j++){  
                flag = isDup(lis.get(i),lis2.get(j));   // 判断是否重复  
                if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据  
            }  
            if(!flag){  
                lis2.add(lis.get(i));   // 不重复,则添加  
                kinds++;
            }  
        }  
    }  
    // 输出  
    public static void print(){  
        for(String s:lis2){  
            String a = s.substring(0,2);  
            String b = s.substring(2,4);  
            String c = s.substring(4,6);  
            String d = s.substring(6);  
            System.out.println(a+" x "+b+" = "+c+" x "+d);  
        }  
    }  
    // 检测结果,符合条件的输出  
    public static void check(int [] n){  
        StringBuffer sb = new StringBuffer();  
        for(int x:n){   // 数字数组转为字符串  
            sb.append(x);  
        }  
        int a = Integer.parseInt(sb.substring(0,2).toString());  
        int b = Integer.parseInt(sb.substring(2,4).toString());  
        int c = Integer.parseInt(sb.substring(4,6).toString());  
        int d = Integer.parseInt(sb.substring(6).toString());  
        if(a*b==c*d){  
            lis.add(sb.toString()); // 添加结果  
        }  
    }  
    // 全排列  
    public static void allSort(int start,int end){  
    	if (start == end) {
			check(n);
		} else {
			for (int i = 1; i < 10; i++) {
				if (vis[i])
					continue;
				n[start] = i;
				vis[i] = true;
				allSort(start + 1, end);
				vis[i] = false;
			}
		}
    }  
    public static void main(String[] args){  
    	allSort(0,9);
    	removeDuplicate();  // 去除重复元素  
        print();    // 输出结果  
        System.out.println("kinds:"+kinds);
    }   
} 


/*----------------------------------黄金分隔线---------------------------*/
import java.util.List;  
import java.util.ArrayList;  

public class 乘法运算 {  
    static List<String> lis = new ArrayList<String>();  // 结果1(有重复的结果)  
    static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果) 
    static int kinds = 1;
	static boolean vis[] = new boolean[10];
    // 是否重复  
    public static boolean isDup(String s1,String s2){  
        String a1 = s1.substring(0,2);  
        String a2 = s1.substring(2,4);  
        String b1 = s2.substring(0,2);  
        String b2 = s2.substring(2,4);  
        if(a1.equals(b2)&&a2.equals(b1)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    // 去除lis重复元素  
    public static void removeDuplicate(){  
        lis2.add(lis.get(0));  
        for(int i=1;i<lis.size();i++){  
            boolean flag=false;    // 标记是否重复  
            for(int j=0;j<lis2.size();j++){  
                flag = isDup(lis.get(i),lis2.get(j));   // 判断是否重复  
                if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据  
            }  
            if(!flag){  
                lis2.add(lis.get(i));   // 不重复,则添加  
                kinds++;
            }  
        }  
    }  
    // 输出  
    public static void print(){  
        for(String s:lis2){  
            String a = s.substring(0,2);  
            String b = s.substring(2,4);  
            String c = s.substring(4,6);  
            String d = s.substring(6);  
            System.out.println(a+" x "+b+" = "+c+" x "+d);  
        }  
    }  
    // 检测结果,符合条件的输出  
    public static void check(List<Integer> lis1){  
        StringBuffer sb = new StringBuffer();  
        for(int x:lis1){   // 数字数组转为字符串  
            sb.append(x);  
        }  
        int a = Integer.parseInt(sb.substring(0,2).toString());  
        int b = Integer.parseInt(sb.substring(2,4).toString());  
        int c = Integer.parseInt(sb.substring(4,6).toString());  
        int d = Integer.parseInt(sb.substring(6).toString());  
        if(a*b==c*d){  
            lis.add(sb.toString()); // 添加结果  
        }  
    }  
    // 全排列  
    public static void allSort(List<Integer> lis1,int start,int end){  
    	if(start==end){  
        	check(lis1);
            return ;  
        }  
        for(int i=1;i<10;i++){  
            if(!lis1.contains(i)){
                lis1.set(start, i);  
            }else{  
                continue;  
            }  
            allSort(lis1,start+1,end);  
            lis1.set(start, 0); 
        }  
    }  
    public static void main(String[] args){  
         List<Integer> lis1 = new ArrayList<Integer>();  
         for(int i=0;i<9;i++){  
             lis1.add(0);  
         }  
    	allSort(lis1,0,9);
    	removeDuplicate();  // 去除重复元素  
        print();    // 输出结果  
        System.out.println("kinds:"+kinds);
    }   
} 
/*----------------------------------黄金分隔线---------------------------*/
import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  
public class 乘法运算 {  
    static List<int[]> lis = new ArrayList<int[]>();  
    static List<int[]> lis2 = new ArrayList<int[]>(); 
    static int kinds;
    // 输出所有组合  
    public static void print(){  
    	  for(int[] n:lis2){  
    		  int a = n[0]*10+n[1];  
    	      int b = n[2]*10+n[3];  
    	      int c = n[4]*10+n[5];
    	      int d = n[6]*100+n[7]*10+n[8];  
              System.out.println(a+" x "+b+" = "+c+" x "+d);  
          }  
    }  
    // 是否重复  
    public static boolean isDup(int a[],int b[]){ 
    	int a1 = a[0]*10+a[1];
    	int a2 = a[2]*10+a[3];
    	int b1 = b[0]*10+b[1];
    	int b2 = b[2]*10+b[3];  
        if(a1 == b2&&a2==b1){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    // 去除lis重复元素  
    public static void removeDuplicate(){  
        lis2.add(lis.get(0));  
        for(int i=1;i<lis.size();i++){  
            boolean flag=true;    // 标记是否重复  
            for(int j=0;j<lis2.size();j++){  
                flag = isDup(lis.get(i),lis2.get(j));   // 判断是否重复  
                if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据  
            }  
            if(!flag){  
                lis2.add(lis.get(i));   // 不重复,则添加  
                kinds = kinds +1;
            }  
        }  
    }  
    // 检测,并添加符合的组合  
    public static void check(int[] n){  
        int a = n[0]*10+n[1];  
        int b = n[2]*10+n[3];  
        int c = n[4]*10+n[5];
        int d = n[6]*100+n[7]*10+n[8];
        if(a*b==c*d){  
             lis.add(Arrays.copyOf(n, n.length)); 
        }  
    }  
    // 全排列  
    public static void f(int[] n,int start,int end){  
        if(start>=end){  
            check(n);   // 检测,并添加符合的组合  
            return ;  
        }else{  
            for(int i=start;i<n.length;i++){  
                int temp = n[start];  
                n[start] = n[i];  
                n[i] = temp; 
                f(n,start+1,end);  
                temp = n[start];  
                n[start] = n[i];  
                n[i] = temp;  
            }  
        }  
    }  
    public static void main(String[] args){  
        int[] n = {1,2,3,4,5,6,7,8,9};
        f(n,0,n.length-1);  
        removeDuplicate();  // 去除重复元素  
        print();    // 输出结果  
        System.out.println("kinds:"+kinds);  // 输出个数  
    }  
} 

/*----------------------------------黄金分隔线---------------------------*/

//其实题目要求左边的两个乘数交换算同一方案,不要重复输出!
//即由对称性可知,求出所有组合,然后除以2即为所求答案
//所以程序可以省略去重函数public static void removeDuplicate()
//程序代码可化简为:

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  
public class 乘法运算 {  
    static List<int[]> lis = new ArrayList<int[]>();  
    static int kinds; 
    // 检测,并添加符合的组合  
    public static void check(int[] n){  
        int a = n[0]*10+n[1];  
        int b = n[2]*10+n[3];  
        int c = n[4]*10+n[5];
        int d = n[6]*100+n[7]*10+n[8];
        if(a*b==c*d){  
             lis.add(Arrays.copyOf(n, n.length)); 
             kinds++;
        }  
    }  
    // 全排列  
    public static void f(int[] n,int start,int end){  
        if(start>=end){  
            check(n);   // 检测,并添加符合的组合  
            return ;  
        }else{  
            for(int i=start;i<n.length;i++){  
                int temp = n[start];  
                n[start] = n[i];  
                n[i] = temp; 
                f(n,start+1,end);  
                temp = n[start];  
                n[start] = n[i];  
                n[i] = temp;  
            }  
        }  
    }  
    public static void main(String[] args){  
        int[] n = {1,2,3,4,5,6,7,8,9};
        f(n,0,n.length-1);  

        System.out.println("kinds:"+kinds/2);  // 输出个数  
    }  
} 


posted @ 2013-06-09 20:20  爱生活,爱编程  阅读(516)  评论(0)    收藏  举报