吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字个包含乘积的一半位数的数字,以两个0结尾的数字是不允许的。例如1260=12*60,1827=21*87,2187=27*81,要求找出4位数的所有吸血鬼数字。
---------------------------------------------------------------------------------------
- package cn.itcat.damo1;
- import java.util.Arrays;
- public class theVampire {
- /**
- * 一个四位的数字可以拆分成两个数字的乘积,顺序不限。 比如:1260=21*60;
- *
- * @author yxx
- */
- public static void main(String[] args) {
- getVampire_2();
- }
- // 高效率的写法
- public static void getVampire_2() {
- String str_1[], str_2[];
- int from = 0;
- int to = 0;
- int sum = 0;
- int count = 0;
- for (int i = 10; i < 100; i++) {
- from = Math.max(1000 / i, i + 1);
- to = Math.min(10000 / i, 100);
- // 避免重复,同时保证i,j两个两位数相乘的积在1000和10000之间
- for (int j = from; j < to; j++) {
- int i_val = i * j;
- if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
- // System.out.println("过滤数字");
- continue;
- }
- //将乘积和两个乘数的数字存入字符串数组
- str_1 = String.valueOf(i_val).split("");
- str_2 = (String.valueOf(i) + String.valueOf(j)).split("");
- //将字符从小到大排序
- Arrays.sort(str_1);
- Arrays.sort(str_2);
- //如果两个字符串数组相同,则是吸血鬼数字
- if (Arrays.equals(str_1, str_2)) {
- sum++;
- System.out.println("第" + sum + "组::" + i + "*" + j + "="
- + i_val);
- ++count;
- }
- }
- }
- System.out.println("一共" + count + "组吸血鬼");
- }
- }
复制代码
从网上找的方法,我将自己理解的代码写在注释里,但是为什么判断条件中瞒住(i_val - i - j) % 9 != 0 的数字可以直接过滤掉? |