吸血鬼数(Java实现)

本文介绍了吸血鬼数字的概念,即偶数位数的数字能由一对位数为其一半的数字相乘得到。通过逆向思维,避免枚举所有四位数,而是枚举所有两位数,确保乘积为四位数,并检查是否满足吸血鬼数字的条件。此外,通过数学分析,发现吸血鬼数字减去其乘积因子后能被9整除,从而提高了算法效率。文章提供了Java源代码实现,并展示了运行结果。
摘要由CSDN通过智能技术生成

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 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值