Java实现4位数吸血鬼数字算法

定义:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序,以两个0结尾的数字是不允许的。如1260 = 21 * 60,2187 = 27 * 81等。

本例中实现4位数之内的所有吸血鬼数字。

核心代码:

public static void main(String[] args) {
		//吸血鬼数字计数器
		int count = 0;
		//乘积数字
		int m = 0;
		//字符组,匹配用的
		char[] a,b;

		//loop循环次数
		int loop = 0;

		for(int i=10;i<100;i++){
			//Math.max(1000/i, i+1) 可以理解为i*j>1000 && j>i
			for(int j=Math.max(1000/i, i+1);j<100;j++){
				//计算乘积
				m = i*j;
				//过滤
				if(m<1000 || m%100==0 || (m - i - j) % 9 != 0){
					continue;
				}
				//有效循环次数
				loop++;
				//乘积数字转字符数组
				a = String.valueOf(m).toCharArray();
				//两个数字转字符数组
				b = (String.valueOf(i)+String.valueOf(j)).toCharArray();
				//排序
				Arrays.sort(a);
				Arrays.sort(b);
				if(Arrays.equals(a, b)){
					count++;
					System.out.println("第 "+count+" 个吸血鬼数字, "+m+" : "+i+" * "+j);
				}
			}
		}
		System.out.println("有效循环次数:"+loop+" .");

	}

运行结果:

第 1 个吸血鬼数字, 1395 : 15 * 93
第 2 个吸血鬼数字, 1260 : 21 * 60
第 3 个吸血鬼数字, 1827 : 21 * 87
第 4 个吸血鬼数字, 2187 : 27 * 81
第 5 个吸血鬼数字, 1530 : 30 * 51
第 6 个吸血鬼数字, 1435 : 35 * 41
第 7 个吸血鬼数字, 6880 : 80 * 86
有效循环次数:229 .

说明:

关于(m - i - j) % 9 != 0条件的说明:
假设abcd = 1000a+100b+10c-d
任意的2位组合,如ac,db, 表示为10a+c,10d+b
则
abcd - ac-db = 990a+99b+9c-9d
这个数肯定是9的倍数,
对于其他针对abcd的排列组合,也成立此等式
所以,对于满足条件的吸血鬼数字,(m - i - j) % 9 != 0 肯定成立
不满足这个条件的,则一定不是吸血鬼数字,此判断可以将循环数从3000多次骤降至200多次。 
时间: 2024-11-10 08:24:31

Java实现4位数吸血鬼数字算法的相关文章

吸血鬼数字算法

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积一半位数的数字,其中从最初数字中选取的数字可以任意排序.以两个0结尾的数字是不允许的.下面是一些吸血鬼数字: 15*93: 139521*60: 126021*87: 1827 写一个程序找出4位数中的所有吸血鬼数字: 下列解法为Java编程思想提供的参考解法 1 int[] startDigit = new int[4]; //start digit 2 int[] productDigit = new int[4];

吸血鬼数字算法参考 -- javascript版本

// 吸血鬼数字 java编程思想 第四章 75页 练习10 for (var i = 10; i <= 99; i++) { for (var j = i + 1; j < 99; j++) { if (i * j < 1000) continue; var result = (i * j + ''); var regx = new RegExp((i + '') [0] + '|' + (i + '') [1] + '|' + (j + '') [0] + '|' + (j + ''

java实现 阿拉伯数字转换为汉字数字 算法

package test; public class NumberFormatTest { static String[] units = { "", "十", "百", "千", "万", "十万", "百万", "千万", "亿","十亿", "百亿", "千亿",

Thinking In Java 里面吸血鬼数字题

首先解释一下吸血鬼数字:吸血鬼数字是指位数为偶数的数字,可由一对数字相乘而得到,这对数字各包含乘积的一半位数的数字,以两个0结尾的数字是不允许的. 四位数吸血鬼数字示例:1260=21*60,1827=21*87,2187=27*81-- 先列出结果:一共7个:1260=21*60,1395=15*93,1435=41*35,1530=51*30,1827=87*21,2187=27*81,6880=86*80 方法一: 本方法是<Thinking in Java>的官方答案,由于所处章节很靠

《Thinking in Java》习题——吸血鬼数字

最近在看<Java编程思想>,这本书非常棒,不愧是Java程序员的圣经.看到第四章,后面有道题目很有意思,于是就自己做了做. 1. 我的思路很简单,但是算法效率非常之低.就是把4位数拆成4个数字,比如1260--->1,2,6,0.然后4位数字组合成两个2位数,计算它们 的乘积,相等则就是吸血鬼数字. 1 public class Test2 { 2 /* 3 * 将4位数拆分成4个数 4 * */ 5 public int [] array(int num){ 6 int [] a =

java吸血鬼数字

很惭愧(其实没什么惭愧,水平就这样),搞了半晌才写出来了一个求四位吸血鬼数字的方法 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. 以两个0结尾的数字是不允许的,例如,下列数字都是"吸血鬼"数字: 1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81 int len = 4; // 求出四位值得范围 int max = (int) (Math.pow(10,

Java 找出四位数的全部吸血鬼数字 基础代码实例

/** * 找出四位数的全部吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,能够由一对数字相乘而得到,而这对数字各包括乘积的一半位数的数字,当中从最初的数字中选取的数字能够随意排序. * 以两个0结尾的数字是不同意的. *   比例如以下列数字都是吸血鬼数字 1260=21*60 1827=21*87 2187=27*81 ... * 比較笨的低效率的做法: 遍历全部四位数, 每生成一个四位数的时候, *         在双重循环遍历两位数,在两位数的内层循环中推断是否与最外层循环的四位数相等

Java编程思想——吸血鬼数字问题

吸血鬼数字:我最开始想的是把四位数拆开,然后进行自由组合然后相乘,最后比较得到结果,在网上去看了一些朋友的做法,让我大吃一惊啊,想到自己的算法也要好好看了 ,这样子下去是不行滴 现贴出代码: package edu.cqu.main; import java.util.Arrays; /** * 问题描述: * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 例如: * 1260 = 21 *

【Java】 Thinking in Java 4.8 练习10 吸血鬼数字

题目: 吸血鬼数字是指位数为偶数的数字,可以有一对数字相乘得到,而这对数字各包含成绩的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.  以两个0结尾的数字是不允许的.写一个程序,找出4位数中所有吸血鬼数字. 方法一: 1 public static void main(String[] args) { 2 outer: for (int i = 10; i <= 99; i++) { 3 for (int j = i + 1; j <= 99; j++) { 4 int sum =