问题描述:

任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大的数减去较小数,不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。
例如:
4321-1234=3087
8730-378=8352
8532-2358=6174
7641-1467=6174
编写程序验证卡布列克常数。


我的代码:

n=list(raw_input("input a number: "))
def minnb(n):
    mi=[]
    n.sort()
    for i in range(len(n)):
        mi.append(int(n[i]))
    return  mi

def maxnb(n):
    ma=[]
    n.sort(reverse=True)
    for i in range(len(n)):
        ma.append(int(n[i]))
    return ma

def fun(ma,mi):
    t=(ma[0]*1000+ma[1]*100+ma[2]*10+ma[3])-(mi[0]*1000+mi[1]*100+mi[2]*10+mi[3])
    return t

def lists(s):
    return list(str(s))

while True:
    a=maxnb(n)
    b=minnb(n)
    c=fun(a,b)
    if c==6174:
        print "It is OK..."
        break
    else:
        n=lists(c)


我的思路:

各函数说明

minnb:返回数的正向排序列表即最小数,格式为[1,2,3,4]

maxnb:返回输的逆向排序列表即最大数,格式为[4,3,2,1]

fun:返回两个数的差值,类型为int

lists:将一个整数转换为如['1','2','3','4']格式的列表


了解这些函数的功能后,整个代码就好懂了。整个过程是这样:传入参数1234,变为['1','2','3','4'],然后通过minnb函数变为[1,2,3,4]格式,同理也得到[4,3,2,1],然后通过fun函数得到两者之差,判断其值是否等于6174,如果等于就完成了证明。否则将int类型的差值通过lists函数转换为[1,2,3,4]格式作为参数传入,继续循环,直到出现6174再退出;


示例代码:

def fun(n):
    if n == 6174:
        print '6174'
        return
    a = []
    while n:
        a.append(n % 10)
        n /= 10
    a.sort()
    s = 0
    k1 = 1
    k2 = 1000
    for x in a:
        s += x * (k1 - k2)
        k1 *= 10
        k2 /= 10
    fun(s)
fun(1234)


我的代码只是提供一种解决思路,感觉太繁琐了,很臃肿的样子,还是示例代码要好一些,建议看一下!


题目出处:http://www.cheemoedu.com/exercise/65