黑洞数--python

  黑洞数:黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者是冰雹原理中的“1”黑洞数

EG:

  • 举个例子,三位数的黑洞数为495
  • 简易推导过程:随便找个数,如297,三个位上的数从小到大和从大到小各排一次,为972和279,相减,得693
  • 按上面做法再做一次,得到594,再做一次,得到495
  • 之后反复都得到495
  • 再如,四位数的黑洞数有6174
 1 def fun(n):
 2     k = n
 3     a = []
 4     while k > 0:
 5         a.append(k % 10)
 6         k //= 10   #这里要使用地板除
 7 
 8     a.sort()
 9 
10     s1 = 0
11     for i in a:
12         s1 = s1*10 + i
13 
14     s2 = 0
15     for i in a[::-1]:
16         s2 = s2*10 + i
17 
18     if (s2 - s1) == n:
19         return n
20     else:
21         return fun(s2 - s1)

传进去一个整数,然后返回一个黑洞数,但是这个里面可以改进,将一个整数拆分成一个列表,可以其使用字符串的思想,获得排列后最大的数和最小的数,可以使用一个reduce内置函数和lambda表达式

 1 from functools import reduce
 2 def fun(n):
 3     k = n
 4     a = [int(i) for i in str(n)]  #一行代码搞定
 5 
 6     a.sort()
 7 
 8     s1 = reduce(lambda x, y: x * 10 + y, a)  #一行代码搞定
 9     s2 = reduce(lambda x,y:x * 10 +y,a[::-1])
10 
11 
12     s2 = 0
13     for i in a[::-1]:
14         s2 = s2*10 + i
15 
16     if (s2 - s1) == n:
17         return n
18     else:
19         return fun(s2 - s1)
原文地址:https://www.cnblogs.com/luojianyi/p/9516381.html