`
peng5047
  • 浏览: 14041 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

吸血鬼数字

 
阅读更多

    今天在看《Java编程思想》的时候遇到求“吸血鬼数字”的问题。

    吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,这对数字各包含乘积的一半的数字,例如:1260=21*60,1827=21*87……,1260、1827这样的数字就叫做吸血鬼数字。以两个0结尾的数字不是吸血鬼数字。

    我在网上看到了一个比较高效的算法(http://topic.csdn.net/u/20090123/10/8dc0c939-20ae-41f1-a7c1-d05b897b27c7.html):

import java.util.Arrays;

public class Vampire {

	public static void main(String[] args) {
		int count = 0;//4位的吸血鬼数字的个数
		int product;//乘积
		char[] pArray;//乘积的字符数组
		char[] nArray;//数字的字符数组
		int num = 0;//内层循环体的执行次数
        for(int i = 11;i < 100;i++)
        	for(int j = 1000 / i + 1 > i ? 1000 / i + 1 : i;j < 100;j++) {//关键代码1
        		product = i * j;
        		if(product % 100 == 0 || (product - i - j) % 9 != 0) //关键代码2
        			continue;
        		num++;
        		pArray = String.valueOf(product).toCharArray();
				nArray = (String.valueOf(i) + String.valueOf(j)).toCharArray();
				Arrays.sort(pArray);
				Arrays.sort(nArray);
				if(Arrays.equals(pArray,nArray)) {
					System.out.println(i + "*" + j + "=" + product);
					count++;
				}
        	}
        System.out.println("共找到" + count + "组吸血鬼数字");
        System.out.println("内层循环共执行" + num + "次");
	}
}

   代码解释:

   关键代码1:j的初始值的设定。注意到i和j都是两位数,为避免重复,可设定j不小于i,又因为i和j的乘积大于1000,因此j应取1000/i + 1 与 i中的较大者。如此一来,相比直接设定i = 11,j = i要减少很多内层循环次数。

    关键代码2:根据吸血鬼数字的定义,以两个0结尾的数字不是吸血鬼数字,因此如果乘积能被100整除,就被pass了,另外,假定任意一个4位数字A表示成1000*a + 100*b + 10*c + d的形式,那么如果这个数是吸血鬼数的话,那么它可以表示成两个两位数x,y的乘积的形式,即A = x * y。其中x、y可以表示成x = 10*a + b,y = 10*c + d或x = 10*a + c,y = 10*b + d……之类的形式。

    以x = 10*a + b,y = 10*c + d为例,A - x - y = 990*a + 99*b = 9*(110*a + 11*b),能被9整除

    x、y的其他形式也同样能被9整除。

程序的执行结果如下:

15*93=1395

21*60=1260

21*87=1827

27*81=2187

30*51=1530

35*41=1435

80*86=6880

共找到7组吸血鬼数字

内层循环共执行243次

如果去掉关键代码2处的判断,则内层循环将会执行3337次,程序效率的提升非常显著。不过这一点非常不容易想到,特做此笔记,加深记忆。 

 

分享到:
评论
1 楼 luolanchun 2012-07-11  

相关推荐

    4位吸血鬼数字

    在编程领域,"吸血鬼数字"是一种特殊的数字类型,这个概念源于数学,后被引入到编程挑战中,成为一种有趣的算法问题。4位吸血鬼数字是指由四个不同的数字组成,可以分解成两个两位数的乘积,这两个两位数的各位数字...

    1-10000吸血鬼数字

    ### 吸血鬼数字的理解与计算 #### 一、什么是吸血鬼数字? 吸血鬼数字(Vampire number)是一种有趣的数学概念,属于娱乐数学的一部分。一个标准的n位数称为一个n阶吸血鬼数字,如果它可以表示为两个n/2位数相乘的...

    Java实现吸血鬼数字

    吸血鬼数字,又称为吸血鬼数或德古拉数,是指一个四位数(或者更一般的n位数),它的每一位数字可以分为两组,每组包含一半的数字,这两组数字相乘的结果等于原数。例如,1264 是一个吸血鬼数字,因为 12 * 64 = ...

    c语言 吸血鬼数字简单源码

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

    JAVA求吸血鬼数字

    吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以2个0结尾的数字是不允许的,例如,下列数字都是吸血鬼数字: 1260 ...

    JAVA吸血鬼数字算法

    THINK IN JAVA上的课后题,只是寻找4位数的。

    1-10000中的吸血鬼数组合

    在给定的压缩包文件中,"复件 1-10000两数相乘的所有吸血鬼数字.txt"很可能是包含了1到10000所有吸血鬼数对的列表,这样的文件可以用于验证自己的程序结果或进行进一步的分析。而另外两个文件"复件 新建 文本文档6....

    swf吸血鬼 进程提取工具

    《SWF吸血鬼:进程提取工具深度解析》 在数字化时代,SWF(ShockWave Flash)文件广泛应用于网页和应用程序中,展示丰富的多媒体内容。然而,有时我们需要从运行的进程中提取这些SWF文件,例如为了分析、调试或保存...

    Flash吸血鬼

    【Flash吸血鬼】是一种工具或技术,专门用于从zineMaker这样的电子杂志制作软件创建的模板中提取SWF(ShockWave Flash)文件。SWF是Adobe Flash平台生成的交互式内容格式,常用于在线多媒体展示、游戏和应用程序。...

    helsing:POSIX吸血鬼编号生成器

    赫尔辛一个POSIX吸血鬼数字生成器,内置了heapsort。该项目的重点是性能,代码可读性和可移植性。 在helsing / configuration.h中,您可以轻松设置线程数,选择算法实现并进行调整,调整详细程度并启用从检查点恢复...

    吸血鬼算法

    吸血鬼算法是指一种特殊的算法,它可以将一个数字分解成两个相同长度的数字乘积。这种算法通常用于解决某些特殊的数学问题。 在给定的代码中,我们可以看到作者使用Java语言编写了一个吸血鬼算法。该算法的主要思想...

    吸血鬼FlashVampire_22

    《吸血鬼Flash Vampire_22:从EXE电子书中提取SWF的利器》 在数字出版领域,尤其是电子书籍的制作中,Flash技术曾被广泛应用于制作动态、交互式的阅读体验。然而,随着HTML5的兴起和Flash的逐渐退役,如何从那些...

    vampire-number-kata:Java中的吸血鬼号码的Kata(只是为了好玩)

    ##挑战:给定一个数字,检测并显示介于0和该给定数字之间的所有吸血鬼数字吸血鬼编号-Fang1 * Fang2 规则1:吸血鬼编号必须为偶数位数规则2:每个毒牙的位数必须是吸血鬼数的一半规则3:吸血鬼编号中的所有数字必须...

    Flash吸血鬼-提取Flash的精灵

    《Flash吸血鬼:深入解析Flash精灵的提取技术》 在数字艺术与动画的世界中,Flash作为一种曾经风靡一时的创作工具,为无数设计师提供了展现创意的舞台。然而,随着时间的推移,虽然Flash逐渐淡出主流,但其丰富的...

    Vampire Code

    有多种关于吸血鬼数字的算法 ! 输出结果为: 1260 = 21 * 60 1395 = 15 * 93 1435 = 41 * 35 1530 = 51 * 30 1827 = 87 * 21 2187 = 27 * 81 6880 = 86 * 80 6880 = 80 * 86 以上仅供参考:

    xixuegui.zip_Java编程_Java_

    在Java编程领域,"吸血鬼数字"是一个有趣的算法问题,它涉及到数字处理和字符串操作。吸血鬼数字(Vampire Number)是指一个大于1的偶数,可以由两个较小的正整数相乘得到,这两个小整数的位数相同,且它们的所有...

    java初学者试题

    10. **吸血鬼数字识别**:编写代码识别特定位数的吸血鬼数字,涉及字符串操作、排序和乘法验证,挑战高级逻辑与算法设计能力。 以上知识点覆盖了Java编程的基础语法、面向对象编程、控制流程、数据类型操作及高级...

Global site tag (gtag.js) - Google Analytics