本文主要是介绍吸血鬼数(Java实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字的位数是原数字的一半位数,并且由组成原数字的各个位数组成,以两个0结尾的数字不是吸血鬼数字。
例如:1260 = 21 * 60 1827 = 21 * 87 2187= 27 * 81
求所有四位吸血鬼数字
解决方案一(逆向思维)
Analyse
通常思维是枚举所有的四位数来找出所有符合条件的吸血鬼数,然而,算法需要枚举的数实在是太多了,四位数的个数为9000个(我们暂且做粗略考虑,不做精细打算),算法的时间复杂度相对较高。逆向思维是,因为分解的乘数都是两位数,所以列举所有的两位数,求得结果要为四位数,再进一步判断是否满足吸血鬼数的条件(需要枚举的个数低于9000不要太多)。设置过滤条件
为了让算法更高效率的进行,就需要过滤一些可以迅速判断出不符合条件的枚举。
value=i*j (其中i < j,10 <= i <= 99)
判断j的循环范围,就至少需要两者的乘积可以构成四位数,所以1000/i和10000/i是一个界限。为了避免出现重复的乘积,还需和i+1比较大小。
假设value = 1000a + 100b + 10c + d, 因为满足val = i * j, 则有x = 10a + b, y = 10c + d
则value - i - j = 990a
这篇关于吸血鬼数(Java实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!