我在以下代码中收到“超出时间限制”错误。如何解决该错误

时间:2019-07-20 16:36:34

标签: python-3.x

下面的代码是我检查一个数字的总和是否为回文的观点,如果总和为回文则将显示总和,否则将重复此过程直到得到回文。设置为执行时,我收到一个超过时间限制的错误。我在哪里需要更正代码?

def pal(n1):
    temp=n1
    rev=0
    while(temp>0):
        rev=(rev*10)+(temp%10)
        temp=temp/10
    sum1=n1+rev
    temp=sum1
    rev=0
    while(temp>0):
        rev=(rev*10)+(temp%10)
        temp=temp/10
    if(rev==sum1):
        print(sum1)
    else:
        pal(sum1)


n=int(input())
pal(n)

我希望数字453的输出为6666。 即

  • 453+354=807(不是回文。请重复此过程)
  • 807+708=1515
  • 1515+5151=6666(这是回文)

2 个答案:

答案 0 :(得分:1)

您的问题是您要检查while temp > 0:,但是在该循环中,您正在使用浮动除法temp=temp/10。因此条件将始终成立。例如:

>>> 8/10
0.8
>>> 0.8/10
0.08

您想要的是将部门更改为 int部门

>>> 8//10
0

仍然您可能会考虑使用字符串,在这种情况下这会容易得多:

def pal(n):
    rev_n = str(n)[::-1]
    sum_str = str(n + int(rev_n))
    while sum_str != sum_str[::-1]:
        # print(sum_str)
        sum_rev = sum_str[::-1]
        sum_str = str(int(sum_str) + int(sum_rev))
    print(sum_str)

加上注释后的打印内容,将得出:

>>> pal(453)
807
1515
6666

答案 1 :(得分:0)

这里是使用字符串操作执行此操作的一种方法,它比尝试使用数字操作容易得多。这也是您随后描述内容的更直接翻译。 (我看不到您的代码和描述之间的链接...)

def is_palindrome(text):
    # : approach1, faster for large inputs
    # mid_length = len(text) // 2
    # offset = 0 if len(text) % 2 else 1
    # return text[:mid_length] == text[:-mid_length - offset:-1]

    # : approach2, faster for small inputs
    return text == text[::-1]


def palindrome_sum(num):
    while not is_palindrome(num):
        num = str(int(num) + int(num[::-1]))
    return num


num = input()  # 453
palindrome = palindrome_sum(num)
print(palindrome)
# 6666