我试图修改答案,给我最接近的最低回文数。
我尝试修改过这个问题的答案:
def lowest(n):
s = str(n + 1)
l = len(s)
if s[:l//2][::-1] < s[(l+1)//2:]:
head = str(int(s[:(l+1)//2]))
else:
head = s[:(l+1)//2]
print int(head + head[:l//2][::-1])
但是对于数字1000,它仍然返回1001.我做错了什么?
答案 0 :(得分:1)
如果您正在寻找之前的回文,您已在链接的答案中反转了几个信号并添加了边缘情况例外(对于10 ^ k + 1,对于所有偶数k&gt; ; 0)
def prev_palindrome(n):
s = str(n - 1)
l = len(s)
if s[:l//2][::-1] > s[(l+1)//2:]:
head = str(int(s[:(l+1)//2])-1)
else:
head = s[:(l+1)//2]
if len(head) < l/2:
return int(head + '9' + head[:l//2][::-1]) #edge case
else:
return int(head + head[:l//2][::-1])
如果您想要最近,可以尝试:
nxt = next_palindrome(n)
prv = prev_palindrome(n)
if abs(prv-n) <= abs(nxt-n):
print prv
else:
print nxt
请注意,next_palindrome
和prev_palindrome
返回严格高于/低于n
。