什么是卡布列克常数?
任意一个不是由完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。
对于任意一个4位数n,进行如下的运算:
1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构成的最大的4位数。
2)将组成该4位数的4个数字由小到大排列,形成由这4个数字构成的最小的4位数(如果4个数中含有0,则得到的数不足4位)。
3)求这两个数的差,得到一个新的4位数(高位0保留)。
这称为对n进行了一次卡布列克运算。
存在这样一个规律:对一个各位数字不全相同的4位数重复进行若干次卡布列克运算,最后得到的结果总是6174,这个数被称为卡布列克数。
例如:6543-3456=3087
8730-378=8325
8532-2358=6174
7641-1467=6174
现在要求编程来验证卡布列克常数。
下面直接上代码:
########################
def createlkcs(n):# 将输入的4位数拆分存入数组
# 定义数组lkcs[4],用来存放分解后4位整数num中每位上的数字
lkcs = [0] * 4
# 分解整数n
a = n // 1000 # 千位
b = (n % 1000) // 100 # 百位
c = ((n % 1000) % 100) // 10# 十位
d = ((n % 1000) % 100) % 10 # 个位
lkcs[0] = a
lkcs[1] = b
lkcs[2] = c
lkcs[3] = d
# print(lkcs)
return lkcs
def lkcs_max(lkcs):# 求数组的最大值
lkcs.sort()
maxNum = lkcs[3]*1000 + lkcs[2]*100 + lkcs[1]*10 + lkcs[0]
# print("maxNum = %d" %maxNum)
return maxNum
def lkcs_min(lkcs):# 求数组的最小值
lkcs.sort()
minNum = lkcs[0]*1000 + lkcs[1]*100 + lkcs[2]*10 + lkcs[3]
# print("minNum = %d" %minNum)
return minNum
def kblk(n, count):# 递归求卡布列克常数
if n != 6174 and n != 0: # 若不等于6174且不等于0,则进行卡布列克运算
lkcs = createlkcs(n) # 将4位整数分解,各位数字存入lkcs数组中
max = lkcs_max(lkcs) # 求各位数字组成的最大值
min = lkcs_min(lkcs) # 求各位数字组成的最小值
num = max - min # 求最大值和最小值的差
count += 1
# 输出该步的计算过程
print("[%d]: %d-%d=%d\n" % (count, max, min, num));
kblk(num, count); # 递归调用,继续进行卡布列克运算
if __name__ == "__main__":
n = 1000
count = 0
while n <= 1000 or n > 9999:
n = int(input("请输入一个4位整数:"))
kblk(n, count)
########################
执行结果如下:
请输入一个4位整数:6532
[1]: 6532-2356=4176
[2]: 7641-1467=6174
请输入一个4位整数:8769
[1]: 9876-6789=3087
[2]: 8730-378=8352
[3]: 8532-2358=6174
________________END______________
网友评论