Skip to main content

Problem 4 Project Euler Solution with Python

Largest Palindrome Number

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.?

To solve this problem I first wrote a program which was as follows:
#Time module
import time

#time at start of program
start = time.time()

#Function to check if number is palindrome
def isPalindrome(n):
 number = str(n)
 reverse_number = ''
 for k in number:
  reverse_number = k + reverse_number
 if reverse_number == number:
  return True
 return False

#largest_palindrome
largest_palindrome = 0

#For loop to generate multiples
for i in range(1000,100,-1):
 for j in range(1000,100,-1):
  number = i*j
  if number > largest_palindrome:
   if isPalindrome(number):
    largest_palindrome = number
#Printing the largest palindrome
print largest_palindrome

#Printing the time of execution
print time.time()-start
  I think the above program is pretty easy to understand also the time for the execution was less than 1 second. But I was not satisfied and wanted more faster program.

My first idea was to eliminate the function isPalindrome so that the time for calling the function is reduced throughout the iterations. But as isPalindrome checked if the reverse of the number was the number, so to remove it if I had checked directly the reverse of the number using the if statement, then I would be able to remove isPalindrome and also it would reduce the time of execution.

Because of using the reverse string operation and eliminating the isPalindrome function, time for execution of the code reduced by staggering 90%(approximately).

Program

I would like to explain the for loop block of code which is pretty interesting.

We will consider the example given in the question.

Before the starting of the code the value of the largest_palindrome1 is 0.

Now in the first iteration the value of i is 100 and at next lever the value of j is 100.

The if statement is True because the value of i*j which is 100*100 = 10000 is greater than 0.

In the next line we have used the string extended Slice operation to generate the reverse of the given number.

If the reverse is same then the number is palindrome. Also we have already checked if i*j is larger than largest_palindrome1, and so there is no need to check it again. In the present iteration (i=100, j=100), this condition doesn't execute and the if loop exits.

In the similar way the if loop checks if the number is palindrome and also if the number is larger than the previous value of largest_palindrome1, then the value of largest_palindrome1 is changed.

break has been used because it is un necessary to continue looping as we have found the largest palindrome number(This case is only true when we are iterating from 100 to 1 or 1000 to 1).

If you want to download the above program then you can download it from Github Gist

Output

Summary

I think this problem is also easy to solve but making it run at much shorter time was challenging. The execution time was around 0.01s which is small. But if you have any program whose execution time is less than the above program, please do share it with me so that it will be helpful for the community.

I think the code is pretty easy to understand because it has been commented properly. Also I have explained some part of the code. But if you have any doubt or didn't understand anything then please do comment in the comment box below and I will be glad to help you.

You can also contact me if you want.

If you have any suggestions or found any typo which I made, then please do let me know so that we can improve and help the community.

I would like to thank the Stackoverflow community, which helped me in reducing the execution time.
Jason has also written a very good solution for this question but the execution time was more than mine😋!

Thank you. Have a nice Day😃.

Popular posts from this blog

Project Euler Problem 62 solution with python

Cubic permutations ¶ The cube, 41063625 (3453), can be permuted to produce two other cubes: 56623104 (3843) and 66430125 (4053). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube. Find the smallest cube for which exactly five permutations of its digits are cube.

Project Euler Problem 67 Solution with Python

Maximum path sum II By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 3 7 4 2 4 6 8 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right click and 'Save Link/Target As...'), a 15K text file containing a triangle with one-hundred rows.

Add/Embed SVG to Blogger website

In this post I will tell you my method(trick) of adding SVG images in a blogger website or blog. Before starting , the first thin g I am assu m ing is that you are aware of SVG if you are here. If not please see S calable V ec tor G raphics Recently when I tried to embed a SVG image for a post on pygal, I tried uploading the SVG file and blogger Image uploader came up with an error, because of which I had to find some other way.  SVG File upload Error in Blogger  I started sea rc hing Google " Embed SVG in Blogger " . I found blogorrhea , w h ich gave some i nformatio n on add ing SVG directly as a markup , which worked , but I faced another problem using this . Also th is guy has used lot of Javascript which was confusin g for me, being new to using SVG.   So I first t houg ht of learning on h ow to embed SVG in HTML and t his on e worked out. Actually we can embed SVG in HTML i n following ways: Using Object tag Using Iframe tag Using embed...