'''
Created on 2014年8月24日
Largest palindrome product
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.
@author: wxp2971
'''
import time
# 第一个版本,直接计算,利用语言的特性转化计算回文与否
def checkPalindrome1(number): #检验一个数字是否为回文的
strNum = str(number) # 先把数字转化为字符
listNum = list(strNum) # 把字符转化为列表
numLength = len(listNum)
num = int(numLength / 2)
retVal = True
for i in range(num):
if listNum[i] != listNum[numLength - 1 -i]:
retVal = False
break
return retVal
starttime = time.clock()
maxPalindrome = 0
for i in range(100,999):
for j in range(100,999):
number = i * j
if checkPalindrome1(number):
if number > maxPalindrome:
maxPalindrome = number
endtime = time.clock()
print (maxPalindrome,' ',endtime-starttime)
# 解答中的思想,利用求余后再除,求的是否为回文
def reverse(number):
reversed = 0
while number > 0 :
reversed = 10 * reversed + number % 10
number = int(number / 10)
return reversed
def checkPalindrome2(number): #检验一个数字是否为回文的
return (number == reverse(number))
starttime = time.clock()
maxPalindrome = 0
for i in range(100,999):
for j in range(i,999): # 假设 j < i 可以去掉很多的重复验证项
number = i * j
if checkPalindrome2(number) and (number > maxPalindrome):
maxPalindrome = number
endtime = time.clock()
print (maxPalindrome,' ',endtime-starttime)
# 从大数向小数搜索,搜索的范围会小
starttime = time.clock()
maxPalindrome = 0
for i in range(999,100,-1):
for j in range(999,i,-1): # 假设 j < i 可以去掉很多的重复验证项
number = i * j
if (number <= maxPalindrome):
break
if checkPalindrome2(number):
maxPalindrome = number
endtime = time.clock()
print (maxPalindrome,' ',endtime-starttime)
# 数学分析后得出的结果,可以参考具体的解答
starttime = time.clock()
maxPalindrome = 0
for i in range(999,100,-1):
if i%11 == 0:
j = 999
jd = 1
else:
j = 990
jd = 11
while j > i:
number = i * j
if number <= maxPalindrome:
break
if checkPalindrome2(number):
maxPalindrome = number
j = j -jd
endtime = time.clock()
print (maxPalindrome,' ',endtime-starttime)