4位数吸血鬼数字算法
2017-07-02 00:00
120 查看
java编程思想(第四版) 第四章的练习10.
自己做的,如果还有可优化的地方请多指教
自己做的,如果还有可优化的地方请多指教
/** * 吸血鬼数字是指位数为偶数的数字,由一对数字相乘而得到 * 且这对数字各包含一半位数的数字.排序不限,但是不允许 * 以00结尾 * 如: * 1260 = 21 * 60 * 1827 = 21 * 87 * * 相乘的时候只要用前一个因数和大于等于他的所有因数相乘就行了, * 因为如果还是从10开始乘就会出现重复 * 如当a = 10,b = 11 和 a = 11,b = 10的情况 */ @Test public void getXiXueGui() { // 既然要得到的是4位数的吸血鬼数字,那么两个因数必然都是2位数 // 所以必须是大于10 且小于 100 int a = 10; int b = 10; int num = 0; // 计数器 boolean boo = true; // 只要a和b都小于100就肯定不会出现9999以上的数字,因为最大99 * 99 = 9801 while (a < 100 && b < 100) { int c = a * b; // 相乘结果是4位数,开始进一步判断是否吸血鬼数字 if (c > 1000 && c%100 != 0) { String ab = a + "" + b;// 将两个因数物理拼接起来 String cc = c + ""; for (int i = 0; i < ab.length(); i++) { char at = ab.charAt(i); String cstr = String.valueOf(at); // 只要有一个数字没有在乘积中就不是吸血鬼数字 if (!cc.contains(cstr)) { boo = false; break; } else { /* 如果本次在因数字符串中的数字在乘积字符串中包涵,那么就把乘积字符串中的这个字符删掉. * 避免同一个字符被重复匹配的问题 */ cc = cc.replaceFirst(cstr, ""); } } if (boo) { num++; System.out.println("吸血鬼数字:" + c + " = " + a + " + " + b); } } // 如果b还小于99就让b+1,否则a+1,b = a + 1 + 1开始新一轮计算 if (b < 99) { b++; } else { a++; b = a; } // 重置标记 boo = true; } System.out.println("4位数吸血鬼数字共有: " + num + " 个"); }
相关文章推荐
- 面试题12:打印1到最大的n位数
- ADC的有效位数与有效分辨率的区别
- 音频 属性详解(涉及采样率、通道数、位数、比特率、帧等)
- 1021. 个位数统计 (15)
- PAT L1-003. 个位数统计
- 二进制不同位数
- L1-003. 个位数统计
- 让用户输入一个5位数(若不是5位数,则提示错误),判断它是不是回文数,输出判断结果。回文数:如12321是一个回文数,万位与个位相同,十位与千位相同。
- 剑指Offer 12 打印1到最大的n位数
- 身份证号码位数的含意!
- 算法训练 6-2递归求二进制表示位数 ;求完数;求指数;字符串变换
- 从0到9的数字组成一道一位数加两位数加三位数得四位数的算式不得重复数字
- 1021. 个位数统计 (15)
- C/C++结构体的一个高级特性――指定成员的位数
- 利用R里的options函数进行光标和数字位数设置
- 列出SQL SERVER 所有表,字段名,主键,类型,长度,小数位数等信息
- 求一个大数的位数
- nb -- 法国男子77.99秒心算出200位数13次方根
- 大位数相除
- js有效数字 显示指定位数