注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正
黑洞数又称陷阱数,是指任何一个数字不全相同的整数,在经过有限次“重排求差”操作后,总会得到某一个或某一些数,这些数即为黑洞数。
“重排求差”操作是将组成一个数的各位数字重排,将得到的最大数减去最小数。
例如,207的重排求差操作序列是:720-027=693, 963-369=594, 954-459=495,此时再进行重排求差操作将不会发生改变。
再用208计算一次:820-028=792, 972- 279=693,963-369=594,954-459=495,也是停止到495,所以495是三位黑洞数。
根据上面的的操作可以得出对于任意一个数字不完全相同的整数,最后结果总会陷入黑洞圈或黑洞数里,最后结果一旦为黑洞数之后无论重复多少次重排求差结果都是一样的,因此可以通过判断连续的两次结果是否相等来作为黑洞数的依据。
那么要找出所有三位的黑洞数应该如何实现呢?
代码实现思路如下:
- 将任意三位数拆分
- 拆分后的数重新组合得到最大值和最小值并求差
- 将差值结果暂存到临时变量中
- 将差值继续拆分重组求差
- 判断当前差值与上一差值是否相等,相等结束,不相等循环以上步骤
代码实现如下:
def Rearrange_the_difference(i):a = i//100b = i%100//10c = i%10if a < b:t = aa = bb = tif b < c:t = bb = cc = tif a < c:t = aa = cc = tmax = a*100+b*10+cmin =c*100+b*10+aprint('max={},min={}'.format(max,min))return max-minif __name__ == '__main__':h = 0i = int(input('请输入一个各位不完全相同三位整数:'))h = Rearrange_the_difference(i)while h > 0:last = hh = Rearrange_the_difference(h)if h == last:print('黑洞数:{}'.format(h))break
测试结果如下
请输入一个各位不完全相同三位整数:709
max=790,min=97
max=963,min=369
max=954,min=459
max=954,min=459
黑洞数:495