Python练习(3)

问题描述

黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同的整数,经有限“重排求差”操作,总会得到某一 个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。
举个例子,3位数的黑洞数为495. 简易推导过程:随便找个数,如297,3个位上的数从小到大和从大到小各排一次,为972和279,相减得693。按上面做法再做一次,得到594,再做一次,得到495,之后反复都得到495。
验证4位数的黑洞数为6174。

代码

#构建一个由列表转换成数字的函数,如[2,8,7]---->287
def list2Number(h):
    i=len(h)
    k=0
    for j in range(1,i+1): 
        k+=h[j-1]*(10**(i-j))
    return k

#构建一个重排求差的函数
import numpy as np
def blackhole(n):
    a=[]
    b=n
    while b/10>0:            #把各位上的数字生成列表。缺陷,没办法获得最高位的数字
        e=b%10
        a.append(e)
        b=b/10
    a.append(b)             #记得加上最高位的数字
    c=sorted(a)             #排序用sorted
    f=sorted(a,reverse=True) 
    g=list2Number(f)-list2Number(c)   #将列表转换成数字求差
    return g

#生成一个随机数,查看黑洞数
import random
m=random.randint(1000,9999)      
p=blackhole(m)
print 'm=',m
while blackhole(p)!=p:          #循环,直到黑洞数不变
    p=blackhole(p)
print '四位数的黑洞数为',p

#结果
m= 9966
四位数的黑洞数为 6174

自己拍脑袋想的,统计了一下,26行,再看网上答案,8行,被自己蠢哭。至少写出来了,慢慢来!

函数里,return 替代print 便不会出现结果;
reverse=True , T要大写
生成随机数import random可不写,格式m=random.randint(a,b)

别人家的简洁代码

def fun(n):
    a=[int(i) for i in str(n)]   #str(n)将数字当做字符读出来,再用int转化成数字
    a.sort()
    s1=reduce(lambda x, y: x*10+y, a[::-1])    #reduce 函数  a[::-1] 从最后一个元素开始
    s2=reduce(lambda x, y: x*10+y, a)
    c=s1-s2
    return c if c==n else fun(c)    #if else 判断句写成一行

reduce与lambda函数使用
a.sort()------>a直接自动升序排列
reduce(fun,list,ite)------>从list中第一项逐渐向后取,代入函数fun中,有累积效应
参考:https://blog.csdn.net/jdd92/article/details/77945588

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/82890999