猜算式

标签: 猜算式 蓝桥杯真题
0人阅读 评论(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
…..
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要

核心代码:

        import java.util.List;  
        import java.util.ArrayList;  
        public class Demo01 
        {  
            static List<String> lis = new ArrayList<String>();  // 结果1(有重复的结果)   
            static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果)   
            // 初始化数组为1~9   
            public static void init(int[] n) {  
                for(int i=0;i<9;i++){  
                    n[i] = i+1; // 初始化数组为1~9   
                }  
            }  
            // 是否重复   
            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 = 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));   // 不重复,则添加   
                    }  
                }  
            }  
            // 输出   
            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 fun(){  
                int[] n = new int[9];  
                init(n);    // 初始化数组为1~9   
                allSort(n,0,n.length-1);    // 全排列测试   
                removeDuplicate();  // 去除重复元素   
            }  
            public static void main(String[] args){  
                fun();  //    
                print();    // 输出结果   
            }  
        }  

运行结果:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
58 x 67 = 29 x 134
58 x 69 = 23 x 174
58 x 73 = 29 x 146
58 x 96 = 32 x 174
63 x 74 = 18 x 259
64 x 79 = 32 x 158
73 x 96 = 12 x 584
76 x 98 = 14 x 532

查看评论

2017蓝桥杯 模拟赛 猜算式

题目:猜算式 你一定还记得小学学习过的乘法计算过程,比如:    273 x   15 ------   1365   273 ------   4095    请...
  • linyuxilu
  • linyuxilu
  • 2017-04-06 20:34:32
  • 181

JAVA蓝桥杯(3)猜算式

问题描述看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。 如果没有限定条件,这样的例子很多。 但目前的限定是:这9个方块,表示1~9的...
  • cx118118
  • cx118118
  • 2017-02-15 23:17:00
  • 389

Java算法编程题系列之 3、猜算式

Java算法编程题系列之 3、猜算式 题目: 看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。 如果没有限定条件,这样的例子很多。...
  • Frank_Jay
  • Frank_Jay
  • 2016-02-19 23:07:45
  • 815

蓝桥杯2017模拟题-猜算式

/* 算法思想: 暴力破解,用一个数组去记录0-9出现的个数。 */ #include using namespace std; bool fun(int x,int sum[]){ whi...
  • lvhao__sir
  • lvhao__sir
  • 2017-03-24 00:56:25
  • 605

猜算式java

你一定还记得小学学习过的乘法计算过程,比如:    273 x   15 ------   1365   273 ------   4095    请你观察如下的乘法算式     *** x   **...
  • qq_34902590
  • qq_34902590
  • 2017-03-31 13:10:08
  • 226

[蓝桥杯]-猜算式

题目:猜算式 你一定还记得小学学习过的乘法计算过程,比如:    273 x   15 ------   1365   273 ------   4095    请你观察如下的乘法算式  ...
  • sinat_32588261
  • sinat_32588261
  • 2017-04-05 19:39:09
  • 321

2017蓝桥杯模拟赛-猜算式

#include"iostream" #include"cmath"using namespace std; int find(int i,int * f){ while(i>0){ ...
  • xuptacm
  • xuptacm
  • 2017-03-22 21:11:37
  • 659

蓝桥杯 猜算式 解题报告

看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。 如果没有限定条件,这样的例子很多。 但目前的限定是:...
  • wr132
  • wr132
  • 2015-02-25 21:40:54
  • 1020

算法练习-猜算式

看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数。 如果没有限定条件,这样的例子很多。 但目前的限定是:这9个方块,表示1~9的9个数字,...
  • Amo_te_ama_me
  • Amo_te_ama_me
  • 2016-03-07 08:39:58
  • 787
    个人资料
    专栏达人
    等级:
    访问量: 186
    积分: 435
    排名: 11万+
    博客专栏
    文章存档
    最新评论