题目描述:
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 56,将 56加 65(即把 56 从右向左读),得到 121 是一个回文数。
又如:对于十进制数 87:
STEP1:87+78=165
STEP2:165+561=726
STEP3:726+627=1353
STEP4:1353+3531=4884
在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4步得到回文数 4884。
写一个程序,给定一个 N(2≤N≤10 或 N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible!。
输入格式
两行,分别是 N,M。
输出格式
如果能在 30 步以内得到回文数,输出格式形如 STEP=ans,其中 ansans 为最少得到回文数的步数。
否则输出 Impossible!。
输入输出样例
输入:
10
87
输出 :
STEP=4
N = int(input())
M = input()
list_str = list(M)
list_str.reverse()
M2 = "".join(list_str)
n1 = int(M, base=N) # 将N进制数转为十进制数
n2 = int(M2, base=N)
def trans(N, n):
"""将十进制数转化为N进制数,并以列表的形式返回"""
alist = []
while n:
alist.append(n % N)
n //= N
alist.reverse()
return alist
def dec(N, M):
"""将N进制数转化为十进制"""
n = 0
for i in range(len(M)):
n += N**i*int(M[len(M)-i-1])
return n
count = 0
if n1 == n2:
print("STEP=0")
else:
while count <= 30:
n1 = n1 + n2
n1 = trans(N, n1)
n2 = list(reversed(n1))
count += 1
if n1 == n2:
print("STEP=%d" % (count))
break
n1 = dec(N, n1)
n2 = dec(N, n2)
if count > 30:
print("Impossible!")