《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

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

时间: 2024-08-05 20:48:20

《java编程思想》读后笔记:二,吸血鬼数字的相关文章

【Java编程思想 - 练习】吸血鬼数字

Thinking in Java 这个程序我自己敲出来的代码,用的方法很笨的感觉,将就着吧,目前没时间想那么多,得继续学啊. 1 class Vnum{ 2 public static void main(String args[]){ 3 CheckVampire cVampire = new CheckVampire(); 4 for(int i=1000;i<10000;i++){ 5 if(cVampire.isVampire(i)){ 6 System.out.println(i);

【Java编程思想】二、一切都是对象

尽管Java是基于C++的,但是相比之下,Java是一种更“纯粹”的面向对象设计语言. 2.1 用引用操纵对象 一切都被视为对象, 因此可采用单一固定的语法.尽管一切都被看作对象,但操纵的标识符实际上是对象的一个“引用”. Java里的“引用”与C++中的“引用”是有区别的,但是这个概念不需要完全明白,学会处理引用就可以了. 2.2 必须由你创建所有对象 new关键字的意思就是“给我一个新对象”! 2.2.1对象存储到什么地方 1)寄存器 2)堆栈(RAM) 3)堆(RAM) 4)常量存储(RO

Java编程思想之二十 并发

20.1 并发得多面性 并发编程令人困惑的一个主要原因:使用并发时需要解决的问题有多个,而实现并发的方法也有多种,并且在这两者之间没有明显的映射关系. 20.1.1 更快的执行 速度问题初听起来很简单:如果你需要一个程序运行得更快,那么可以将起断开为多个片段,在单个处理器上运行每个片段. 并发通常是提高运行在单个处理器上的程序的性能,但在单个处理器上运行的并发程序开销确实应该比该程序所有部分都顺序执行开销大,因为其中增加了所谓的上下文切换的代价. 如果没有任务会阻塞,那么在单处理器上使用并发就没

Java编程思想(十二) —— 字符串(1)

字符串在编程中也是经常使用的. 1)不可变 其实查看API就会发现: public final class String extends Object implements Serializable, Comparable<String>, CharSequence final,不可变的. public class TestString { static String upcase(String s){ return s.toUpperCase(); } public static void

Java编程思想学习(二) 操作符

1. 对象“赋值”:对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方.(引用于对象之间存在关联,但这种关联可以被改变.) 2. == 和 != 比较的是对象的引用. equals() 方法的默认行为是比较引用,如果定义类的对象中对 equals()方法进行重写,则可以实现比较对象的实际内容是否相等的效果. 3. “与” (&&) .“或” (||) .“非” (!) 操作只可应用于布尔值.与在 C 和 C

Java编程思想(十二) —— 字符串(2)

上篇讲到String的基本用法及StringBuilder和String的比较.继续. 给大家感受一下RednaxelaFX的厉害,他大学看的书. 嗯,这就是去硅谷的水平,所以,还是继续看书吧. 1)格式化输出 确实,说到C的printf,是不能用重载的+操作符的. printf("%d %f", x , y); %d这些为格式修饰符,%d表示整数,x插入到%d的位置,%f表示浮点数,y查到%f的位置. Java也模仿了C: public class TestString { publ

Java编程思想学习(二)----一切都是对象

2.1用应用操作对象 String s; 这里所创建的只是引用,并不是对象.如果此时向s发送一个消息,就会返回一个运行时错误.这是因为此时s没有和任何事物关联.因此,一种安全的做法是:创建一个引用的同时便进行初始化. 2.2必须由你创建所有对象 一旦创建了一个引用,就希望它能与一个新的对象相关联.通常用new操作符来实现这一目的. String s = new String("asdf"); 2.2.1存储到什么地方 1)寄存器.这是最快的存储区,因为它不同于其他存储区的地方--处理器

java编程思想总结(二)

java编程思想总结(二) java编程思想总结是一个持续更新的系列,是本人对自己多年工作中使用到java的一个经验性总结,也是温故而知新吧,因为很多基础的东西过了这么多年,平时工作中用不到也会遗忘掉,所以看看书,上上网,查查资料,也算是记录下自己的笔记吧,过一段时间之后再来看看也是蛮不错的,也希望能帮助到正在学习的人们,本系列将要总结一下几点: 面向对象的编程思想 java的基本语法 一些有趣的框架解析 实战项目的整体思路 代码的优化以及性能调优的几种方案 整体项目的规划和视角 其它遗漏的东西

Java编程思想(二) —— 初始化与清理

(一)操作符一章的int类型数据溢出的问题在Java7的版本中仍然存在,而且溢出的结果千奇百怪. public class Hello { public static void main(String[] args) { int i = Integer.MAX_VALUE; System.out.println(i); System.out.println(i*4); System.out.println(i*5); } } 结果分别为2147483647,-4,2147483643. 当应用中

JAVA编程思想(2) - 操作符(二)

5. 直接常量 -一般来说,如果程序里使用了"直接常量",编译器可以准确的知道要生成什么样的类型,但有时候却是模棱两可的.这时候需要我们对编译器进行适当的"指导" -直接常量后面的后缀字符标示了它的类型. -指数记数法:e代表"10的幂次" -注意如果编译器能够正确的识别类型,就不必在数值后附加字符,例如语句: float f4 = 200; 不存在含糊不清的地方,所以200后面不需要加L,但是对于:float f4 = 1e-43f; 编译器通