def max(n):
a = []
while n / 1 != 0:
if n % 10 == 0:
k = 0
else:
k = n % 10
n = n / 10
a.append(int(k))
if n < 1:
break
a.sort(reverse=1) # 将得到的每个位数上的数字进行从大到小排序
c = [str(i) for i in a] # 将每一个数字转换成字符串
d = "".join(c) # 添加到字符串中组合
e = int(d)
return e
def min(n):
b = []
while n / 1 != 0:
if n % 10 == 0:
k = 0
else:
k = n % 10
n = n / 10
b.append(int(k))
if n < 1:
break
b.sort() # 将得到的每个位数上的数字进行从小到大排序
c = [str(i) for i in b] # 将每一个数字转换成字符串
d = "".join(c) # 添加到字符串中组合
e = int(d)
return e
x = int(input("请输入一个数字位数为x:"))
a = set()
for y in range(10**(x-1), 10**x):
z = max(y) - min(y)
# print(z)
if z == y:
a.add(z)
if len(a) != 0:
for i in a:
print("{}位数的黑洞数是:{}".format(x, i))
else:
print("{}位数没有黑洞数".format(x))
# 任务一、编写函数计算任意位数的黑洞数。
# 实验描述:
# 黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。
# 例如3位黑洞数是495,因为954-459=495,4位数字是6174,因为7641-1467=6174。
在这个题目的解决过程中,我遇到了一个问题,就是当我取得每个位置上的数字的时候并没有及时的结束循环,从而导致计算失败,当一个个位数最后取余之后并没有加入结束循环的语句。我发现问题之后使用:
if n < 1: break
及时的跳出循环。
这道题大致的解题思路就是使用random生成数字时候,创建一个列表,对生成数字n求出每个位置上的数字放进列表中,然后对列表中的数字使用sort()进行排序这样就求得了它的组成的最大值Max和最小值Min,然后再把它变成字符串之后进行拼接成整数型。最后的判断就很简单了。