Python算法100例-3.8 黑洞数

本文介绍了如何编程求解三位数中的黑洞数,通过分析定义、设计算法,包括拆分、重组、比较和求最大最小值的过程,提供了一个完整的Python程序示例。
摘要由CSDN通过智能技术生成

完整源代码项目地址,关注博主私信'源代码'后可获取

1.问题描述

编程求三位数中的“黑洞数”。

黑洞数又称陷阱数,是指任何一个数字不全相同的整数,在经过有限次“重排求差”操作后,总会得到某一个或一些数,这些数即为黑洞数。“重排求差”操作是将组成一个数的各位数字重排,将得到的最大数减去最小数。例如,207的“重排求差”操作序列是:720-027=693,963-369=594,954-459=495,此时再进行“重排求差”操作不会发生改变。再用208计算一次,也是停止到495,所以495是三位黑洞数。

2.问题分析

根据“黑洞数”定义,对于任意一个数字不全相同的整数,最后结果总会掉入到一个黑洞圈或黑洞数里,最后结果一旦为黑洞数,无论再重复进行多少次的“重排求差”操作,结果都是一样的,因此可把结果相等作为判断“黑洞数”的依据。

3.算法设计

过程如下:

1)将任意一个三位数进行拆分。

2)拆分后的数据重新组合,将可以组合的最大值减去最小值,差值赋给变量j。

3)将当前差值暂存到另一变量h中:h=j。

4)对变量j执行拆分、重组、求差操作,差值仍然存储到变量j中。

5)判断当前差值j是否与前一次的差值h相等,若相等,则将差值输出并结束循环,否则重复步骤3~5。

4.比较三个数的大小并将其重组

求“黑洞数”的关键是求出拆分后所能组成的最大值max和最小值min,求最大值和最小值的关键是找出拆分后数值的大小关系,通过比较找出最大值、次大值及最小值。三个数比较大小可以采用两两比较的方法,首先a与b比较,其次a与c比较,最后b与c比较。比较顺序很重要,有时比较顺序不一样得到的结果也是不一样的。在比较过程中如需对两个数进行交换,则需借助中间变量t来实现,否则变量中存储的数将被改变。如“a=b;b=a;”,第一个语句执行完毕后变量a的值由原值变为b的值,第二个语句的作用是把现在a的值赋给b,但此时a中存储的已经不再是原来的值,而是被赋予的b值。

比较后数值按照从大到小的顺序分别存储在变量a、b、c中,再按一定的顺序重新组合成最大值和最小值。因求最大值和最小值的操作在程序中不止一次用到,故可定义两个函数three_max(a,b,c)和three_min(a,b,c),功能分别是求由三个数组成的最大值和最小值。代码如下:

# 求三位数的组合最大值
def three_max(a, b, c):         # a、b、c分别对应百位、十位、个位
    if a < b:                            # 如果a<b,则将变量a、b的值互换
        t = a
        a = b
        b = t
    if a < c:
        t = a
        a = c
        c = t
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸高铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值