程序地址:http://www.cheemoedu.com/exercise/65
问题描述:
任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大的数减去较小数,不够四位数时补零,类推下去,最后将变成一个固定的数: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://jmbzs.blog.51cto.com/9449309/1785505