Description
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。 例如,我们从6767开始,将得到
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
Input
输入给出一个 (0,10^4) 区间内的正整数 N。
Output
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。
参考程序
def NewOrder(a):#a是字符串
table=[0 for i in range(10)]
for i in range(4):
table[int(a[i])]+=1
up=""
down=""
for i in range(10):
if table[i]!=0:
up+=str(i)*table[i]
for i in range(1,11):
if table[-i]!=0:
down+=str(10-i)*table[-i]
return (int(down),int(up))
def transN(n):
if len(n)<4:
n="0"*(4-len(n))+n
return n
def JudgeEqual(a):
flag=1
for i in range(1,len(a)):
if a[i]==a[0]:
continue
else:
flag=0
break
if flag==1:
return True
else:
return False
N=input()
N=transN(N)
if JudgeEqual(N)==True:
print("{0} - {0} = 0000".format(N))
else:
while True:
high,low=NewOrder(N)[0],NewOrder(N)[1]
if high-low==6174:
print("{0:04d} - {1:04d} = {2:04d}".format(high,low,high-low))
break
else:
print("{0:04d} - {1:04d} = {2:04d}".format(high,low,high-low))
N=str(high-low)
注:
本题为PAT (Basic Level) Practice1019题。在对N的每一位进行递增或递减“排序”时,这里使用桶排序思路,因每一位都是0~9的取值,所以可以考虑使用桶排序。