问题描述:
任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大的数减去较小数,不够四位数时补零,类推下去,最后将变成一个固定的数: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)
我的代码只是提供一种解决思路,感觉太繁琐了,很臃肿的样子,还是示例代码要好一些,建议看一下!
转载于:https://blog.51cto.com/jmbzs/1785505