zoukankan      html  css  js  c++  java
  • 《java编程思想》读后笔记:二,吸血鬼数字

    书本p75中一道读后练习思考题,题目如下:

      吸血鬼数字是指位数为偶数的数字,可以有一对数字相乘得到,而这对数字各包含成绩的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。一两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼数字”:

      1260=21*60,1827=21*87,2187=27*81

     写一个程序,找出4位数的所有吸血鬼数字。

    个人代码:

    public static void main(String[] args) {
            Map<String,String> map = new HashMap<String,String>();
            for (Integer i = 10; i < 100; i++) {        //两个数一定都是两位数
                for (Integer j = 10; j < 100; j++) {
                    Integer total = i * j;            //计算乘积
                    if(total>999 && total<10000){        //判断是否是4位数
                        String totalStr = total.toString();  //将当前数字转成字符串
                        if(total % 100 != 0){          //排除以两个0结尾的情况
                            String iStr = i.toString();
                            String jStr = j.toString();
                            String ijStr = iStr + jStr;    //将当前俩个数拼成4个字符的字符串
                            List<Character> list = new ArrayList<Character>();
                            for(int x=0;x<totalStr.length();x++){
                                list.add(totalStr.charAt(x));  //将两数乘积的四个数字放入list中
                            }
                            int state = 0;
                            for(int x=0;x<ijStr.length();x++){
                                if(list.contains(ijStr.charAt(x))){      //遍历两数组成的字符串每个数字
                                    int indexX = list.indexOf(ijStr.charAt(x));  //当list中含有当前数字时,从list中删除当前数字字符
                                    list.remove(indexX);                //并且记录重复数字
                                    state ++;    
                                }
                            }
                            if(state == 4){
                                String resultStr = totalStr + " = " + iStr + "*" + jStr;  //state==4说明,乘积中含有两个数组成的所有数字字符
                                map.put(totalStr, resultStr);          //以乘积为key,等式为value存入,达到去重效果
                            }
                        }
                    }
                }
            }
            Set<String> keySet = map.keySet();
            for(String key:keySet){
                System.out.println(map.get(key));    //打印结果
            }
        }

    输出结果:

    1435 = 41*35
    1260 = 60*21
    2187 = 81*27
    1395 = 93*15
    1530 = 51*30
    6880 = 86*80
    1827 = 87*21

    我的解决代码如上,暂时还没想到更简便的解决方案,如果朋友感兴趣,可以多交流。

  • 相关阅读:
    2030
    2019
    2018
    在 《检验反相能力, 一题不会者 不配反相》 里 的 回复
    我转载了 历史吧 的 一个 帖 《为什么很多人说中国古代没有科学?这不扯淡嘛》 到 反相吧
    在 简单的数学题也不会做了。做一算术题,看看是否老年痴呆! 里 的 回复
    谈谈 光速
    相对论 的 时空观 本身 就会 导致 一个 绝对 的 参照系
    对 薛定谔 波函数, 我 关心 它的 推导依据, 不太关心 数学形式
    霍奇猜想 (二)
  • 原文地址:https://www.cnblogs.com/don9/p/6753102.html
Copyright © 2011-2022 走看看