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

python实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
def ispalin(x):     #判断是否回文
    i = 0
    flag = True
    while i < len(x)/2:
        if(x[i] != x[-(i+1)]):
            flag = False
            break
        i += 1
    return flag

i = 999
largestpalindromeproduct = 0
while i >= 100:
    j = 999                  #从大到小计算,先算出最大回文数,以便跳过i*j小于的情况
    while j >= i:            #避免重复计算,比如999*998和998*999
        if i*j <= largestpalindromeproduct:
            break
        if ispalin(str(i*j)):
            largestpalindromeproduct = i*j
        j -= 1
    i -= 1
print(largestpalindromeproduct)

上面的方法还有可优化空间,如果仔细分析回文数,会发现3位数乘积所产生都是六位数,设回文数P,个位、十位、百位分别为x、y、z,那么

P = 100000x + 10000y + 1000z + 100z + 10y + x P = 100001x + 10010y + 1100z P = 11(9091x + 910y + 100z) 回文数总是11的倍数,那个上面程序中的i,j至少有一个会是11的倍数,所以可以改为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def ispalin(x):
    i = 0
    flag = True
    while i < len(x)/2:
        if(x[i] != x[-(i+1)]):
            flag = False
            break
        i += 1
    return flag


i = 999
largestpalindrome = 0
while i > 100:
    if i%11 == 0:
        j = 999
        de = 1
    else:
        j = 990      #990是小于999的最大的11的倍数
        de = 11
    while j >= i:
        if i*j <= largestpalindrome:
            break
        if(ispalin(str(i*j))):
            largestpalindrome = i*j
        j -= de
    i -= 1

print(largestpalindrome)