怎样轻松找出4位数的所有“吸血鬼”数字,多种高效算法详解

关于吸血鬼数字算法问题,我也是读《java编程思想》中遇到的,觉得很有意思。于是,就去做了做。但因为我的粗心,读题的时候忽略了点问题,所以导致我的思路出现了岔口!(当时的思路就是想着把一个4位数拆分成两个2位数,存在数组的形式找出吸血鬼数字,也就是官方答案的那种解法)


虽然我没有解出来,但是我对吸血鬼数字的算法问题做了总结、整理,也搜集了很多解法,并给他们编写了大量的注释,为让你们看的更明白。注释中如有错误,请来指正,我将虚心更改!


《Java编程思想》中的Dan Forhan推荐
什么是“吸血鬼”数字呢?

“吸血鬼”数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积一半位数的数字,其中从最初的数字中选取的数字可以任意排序。(以两个0结尾的数字是不允许的),例如下列数字都是“吸血鬼”数字
1260=2160
1827=21
87
2187=27*81

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


解法一、字符串拆分法

思路:虽然我不知道这是谁写的,但是我的确佩服他的解法。
这个解法,利用了字符串的拆分的性质,将4位数拆分成两个2位数,再对它进行字符的拆分、比较得出的吸血鬼数字!
从数据看来比较的次数是3271次

/**
 * 
 * 吸血鬼数字算法
 */
public class TestVampireNumber {
   
	public static void main(String[] args) {
   
		//创建存放两个两位数的字符串数组
		String[] ar_str1, ar_str2;
		int sum = 0; //吸血鬼数字个数计数器
		int count = 0; //算法循环次数计数器
		for (int i = 10; i < 100; i++) {
    //寻找的第一个两位数
			for (int j = i + 1; j < 100; j++) {
    //寻找的第二个两位数
				int i_val = i * j; //两个两位数的乘积
				if (i_val < 1000 || i_val > 9999)
					continue; //积小于1000或大于9999排除,继续下一轮环
				count++; //计算循环次数
				ar_str1 = String.valueOf(i_val).split(""); //将乘积后的数字拆分成单个字符串并放在字符串数组中
				ar_str2 = (String.valueOf(i) + String.valueOf(j)).split(""); //同样将两个两位数拼成一个字符串并拆分成单个字符串放在字符串数组中
				java.util.Arrays.sort(ar_str1); //对两个数组中的元素进行排序
				java.util.Arrays.sort(ar_str2);
				if (java.util.Arrays.equals(ar_str1, ar_str2)) {
    //乘积排序与两个两位数的所有单个字符串进行比较
					// 排序后比较,为真则找到一组(也就是说他们比较左边四个数右边四个数比较完全相等的时候返回true,记为一组吸血鬼数字)
					sum++
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个Java程序,可以找出所有4位数吸血鬼数字: ```java public class VampireNumbers { public static void main(String[] args) { for (int i = 1000; i < 10000; i++) { int a = i / 1000; int b = (i / 100) % 10; int c = (i / 10) % 10; int d = i % 10; if (checkVampireNumber(a, b, c, d, a, b, c, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, b, d, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, c, b, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, c, d, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, d, b, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, a, d, c, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, a, c, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, a, d, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, c, a, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, c, d, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, d, a, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, b, d, c, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, a, b, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, a, d, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, b, a, d)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, b, d, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, d, a, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, c, d, b, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, a, b, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, a, c, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, b, a, c)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, b, c, a)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, c, a, b)) { System.out.println(i); } if (checkVampireNumber(a, b, c, d, d, c, b, a)) { System.out.println(i); } } } public static boolean checkVampireNumber(int a, int b, int c, int d, int w, int x, int y, int z) { int num1 = 10 * a + b; int num2 = 10 * c + d; int product = num1 * num2; int firstHalf = 10 * w + x; int secondHalf = 10 * y + z; return product == firstHalf * secondHalf && product % 100 != 0; } } ``` 该程序通过枚举所有可能的数字组合,并检查它们是否满足吸血鬼数字的定义来找出所有4位数吸血鬼数字
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值