Kaprekar变换数
印度德伏拉利(Devlali)数学家D.R.Kaprekar设计了一个被称为Kaprekar变换的操作。首先选择一个四位不全相同的整数(即不是1111,2222,...),然后重新安排每一位上的数字得到一个最大数和最小数。接着,用最大的数减去最小的数从而获得一个新的数,重复以上操作以不断得到新的数,最后必然得到6174,本文用python来验证这个规律。
验证思路
- 判断所输入的数是否符合四位不全相同整数
- 将所输入的四位整数,并按位数比较大小,分出最大值,较大值,较小值,最小值
- 将其排列组合出最大的四位数和最小的四位数,并将其相减,若差不等于6174,则将所得值重复2.3步骤,若差等于6174,则退出循环语句,完成验证。
完整代码
#判断所输入的数是否符合四位不全相同整数
while 1:
a = input("请输入一个四位不全相同的整数:")
if len(a)!= 4:
print("该整数不是四位数,请重新输入!")
elif a[0]==a[1]==a[2]==a[3]:
print("该整数是四位全相同的整数,请重新输入!")
else:
break
a = int(a)
i = 0
l = []
cha = 0
b = a%1000 #求出百十个位
max4 = (a - b)/1000 #求出千位
d = b%100 #求出十个位
max3 = (b - d)/100 #求出百位
max1 = d%10 #求出个位
max2 = (d - max1)/10 #求出十位
l.append(max4)
l.append(max3)
l.append(max2)
l.append(max1)
l.sort()
max1 = int(l[0]) #最小值
max2 = int(l[1])
max3 = int(l[2])
max4 = int(l[3]) #最大值
while cha != 6174 :
i = i + 1
summax = max4 * 1000 + max3 * 100 + max2 * 10 + max1
summin = max1 * 1000 + max2 * 100 + max3 * 10 + max4
cha = summax - summin
baishige = cha%1000 #求出百十个位
max4 = (cha - baishige)/1000 #求出千位
shige = baishige%100 #求出十个位
max3 = (baishige - shige)/100 #求出百位
max1 = shige%10 #求出个位
max2 = (shige - max1)/10 #求出十位
l = [] #这个地方要把列表清零,当时没注意,在这调试了很长时间
l.append(max4)
l.append(max3)
l.append(max2)
l.append(max1)
l.sort()
max1 = int(l[0]) #最小值
max2 = int(l[1])
max3 = int(l[2])
max4 = int(l[3]) #最大值
print("第",i,"次运算")
print(summax,"-",summin,"=",cha)