musical me
musical me

Reputation: 11

I am getting a "Time Limit Exceeded " error in the following code. How to fix that error

The following code is my view of checking whether the sum of a number and it's reverse is a palindrome or not.If the sum is a palindrome then sum will be displayed.Otherwise the process will be repeated until we get a palindrome. When it is set to execute, I am getting a time limit exceeded error.Where do I need to correct the code?

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)

I expect the output of a number 453 to be 6666. i.e.

Upvotes: 1

Views: 145

Answers (2)

norok2
norok2

Reputation: 26896

Here is one way of doing this using string manipulation, which goes a lot easier than trying to do this with numbers. It is also a more direct translation of what you describe afterwards. (I do not really see the link between your code and your description...)

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

Upvotes: 0

Tomerikoo
Tomerikoo

Reputation: 19414

Your problem is that you are checking for while temp > 0: but inside that loop you are using float division: temp=temp/10. So the condition will always hold. For example:

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

What you want is to change your divisions to int division:

>>> 8//10
0

Still you might consider working with strings which is much easier in that case:

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)

And with the commented print this gives:

>>> pal(453)
807
1515
6666

Upvotes: 1

Related Questions