如何获得给定数字的最接近,最低回文数
问题描述:
我想修改答案以给出最接近的最低回文数。如何获得给定数字的最接近,最低回文数
我试图改变这个问题的答案:
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我到底做错了什么?
答
如果你正在寻找的以前回文,你必须反转几个信号中的链接的答案,并添加一个边缘情况下的异常(10^K + 1,对于所有的偶数K> 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
。
+0
注意,如果'n'是一个回文,它回答'n'(用's = str(n-2)'它排除'n'并且回答严格低于'n'的最接近的) –
1001是一个回文,你的问题是什么? –
'最接近,最低'回文到1000是999 – machinebit
啊是的,抱歉!我读得太快了。那么你的算法不适应!它将数字的一半与另一个进行比较,以确定两个回文选项中哪一个最低。但是对于最低的那个,你有问题可以缩短(编写它需要更少的字符),就像你的例子。 –