青岛IT培训的小编总结,运行出错先不说,发现自己思路很死,想到一个用while取各位的数字存到列表就用到死,重排列数字之后组合成一个数字的时候用的竟然只想到了最蠢的方法,简直愚蠢之极。
然后报错问题,报错是列表超出范围了,重新走一下流程之后发现第一个数1000重组之后的数字是1000和1,1只有1位数可不超范围了,再相减之后成了999,变成一个三位数了???成了求三位数的黑洞数了?而且999三个数字完全相同没有黑洞数。只能说明题意有问题。百度一下发现应该是相减之后不足四位前面应该添零,大致意思是这样
1000-0001 = 0999
9990-0999 = 8991
9981-1899 = 8082
8820-0288 = 8532
8532-2358 = 6174
问题变得复杂了好多,得考虑0的问题。作为练习的前几个题不应该这么麻烦才是,先看看官方给出的解题思路。
def fun(n):
a = [int(c) for c in str(n)]
a.sort()
s1 = reduce(lambda x, y: 10 * x + y, a[::-1])
s2 = reduce(lambda x, y: 10 * x + y, a)
return n if s1 - s2 == n else fun(s1 - s2)
res = fun(6294)
print 'res : ', res
#这是python2.x版本的代码
#查了一下3.x好像是reduce()从全局函数移除了,添加到了fucntools模块里引用要用
from functools import reduce
好吧,老师解题也不走心,完全没考虑我这么多,
题意是要验证四位数的黑洞数,这个只能验证一个数不说还没考虑0的情况。

不过老师用的方法就比我好多了,这就参考老师的代码修改一下我的程序吧
突然灵光一闪,将整数操作变为字符串操作,需要相减时再int,相减之后再与6174比较,如果不同再返回字符串,如果返回的字符串长度不到4在用字符串‘0'+’返回的字符串‘,这样循环操作不就比直接操作整数型数字简单了么。
from functools import reduce
def fun(str_n):
x = ['1111','2222','3333','4444','5555','6666','7777','8888','9999']
if str_n in x:
return str_n
elif str_n == '6174':
return 'succes'
else:
a = [int(c) for c in str_n]
a.sort()
s1 = reduce(lambda x, y: 10 * x + y, a[::-1])
s2 = reduce(lambda x, y: 10 * x + y, a)
m = s1 - s2
s = '0' * (4 - len(str(m))) + str(m)
fun(s)
list_fail = []
for i in range(1000,10000):
if fun(str(i)) == 'succes':
pass
else:
list_fail.append(i)
print (list_fail)
以上就是青岛IT培训给大家做的内容详解,更多关于UI的学习,请继续关注青岛IT培训