什么是6174猜想
1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数,只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174。
以1234为例
第一次变换:4321-1234=3087
第二次变换:8730-378=8352
第三次变换:8532-2358=6174 符合6174猜想
代码证明
代码一:
def DRK(lst):for i in range(7):num1=int(''.join(map(str,sorted(lst))))num2=int(''.join(map(str,sorted(lst,reverse=True))))num3=num2-num1lst=sorted(str(num3))if num3==6174:return Truereturn False#使用for循环进行排列组合
for a in range(1,10):for b in [k for k in range(0,10) if k!=a]:for c in [k for k in range(0,10) if (k!=a and k!=b)]:for d in [k for k in range(0,10) if (k!=a and k!=b and k != c)]:if DRK == False:print('结论不成立!')exit()
print('结论成立。')
用for循环遍历来组合会有很多组合重复被选中,比如1234这个四位数就有多种选法:【1,2,3,4】、【2,1,3,4】、【3,1,2,4】、【4,1,2,3】等等。
别急,咱还有第二套方案!
代码二:
from itertools import *def DRK(lst):for i in range(7):num1=int(''.join(map(str,sorted(lst))))num2=int(''.join(map(str,sorted(lst,reverse=True))))num3=num2-num1lst=sorted(str(num3))if num3==6174:return Truereturn Falselst=[k for k in range(10)]
#使用itertools库中的combinations()函数进行组合
for i in combinations(lst,4):if DRK(list(i))==False:print('结论不成立!')exit() #有一个不成立的就直接退出循环print('结论成立。')
两个代码的效率比较
可见代码二明显优于代码一