def find_maximum():
= max(
ans*j
ifor i in range(100, 1000)
for j in range(100, 1000)
if str(i*j) == str(i*j)[::-1]
)return ans
find_maximum()
题目
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.
问题描述
题目要求:给定两个三位数,找到它们的乘积中最大的回文数。
解答
方法一:暴力遍历法(新手入门)
思路:生成所有3位数的乘积,逐个检查是否为回文数,记录最大值。
优点:代码简单,逻辑直观。 缺点:计算次数高达810,000次,效率极低。
方法二
def reverse(n):
reversed = 0
while n > 0:
reversed = reversed * 10 + n % 10
= n // 10
n return reversed
def is_palindrome(n):
return n == reverse(n)
= 0
largestPalindrome = 100
a def palindrome():
global largestPalindrome, a
while a < 1000:
= 100
b while b < 1000:
= a * b
product if is_palindrome(product) and product > largestPalindrome:
= product
largestPalindrome += 1
b += 1
a return largestPalindrome
reverse():通过数学方法反转数字,避免字符串转换。
global变量:全局记录最大值,但嵌套循环未优化,计算量仍为810,000次。
方法三:减少重复计算
优化点:内层循环从a开始,避免重复检查i*j和j*i。
= 0
largestPalindrome = 100
a def improved_palindrome():
global largestPalindrome, a
while a < 1000:
= a # 从a开始,避免重复
b while b < 1000:
= a * b
product if is_palindrome(product) and product > largestPalindrome:
= product
largestPalindrome += 1
b += 1
a return largestPalindrome
方法四:倒序搜索 + 提前终止
优化点:从999开始倒序搜索,若乘积小于当前最大值则提前终止。
= 0
largestPalindrome = 100
a def optimized_palindrome():
global largestPalindrome, a
while a < 1000:
= 999 # 从999开始
b while b >= a:
= a * b
product if product <= largestPalindrome:
break # 提前终止
if is_palindrome(product):
= product
largestPalindrome -= 1
b += 1
a return largestPalindrome
break:当product <= largestPalindrome时跳出循环,实际计算约5,000次。
方法五:数学优化
数学原理:若乘积为回文数,至少一个数为11的倍数(仅限6位回文数)
= 0
largestPalindrome = 999
a def further_optimized_palindrome():
global largestPalindrome, a
while a >= 100:
if a % 11 == 0:
= 999
b = 1
subtract else:
= 990 # 最大11倍数
b = 11
subtract while b >= a:
= a * b
product if product <= largestPalindrome:
break
if is_palindrome(product):
= product
largestPalindrome -= subtract
b -= 1
a return largestPalindrome
b = 990:当a非11倍数时,b仅取11的倍数,减少候选数。
subtract = 11:步长为11,跳过非11倍数。
方法六:向量化计算
代码逻辑:利用NumPy矩阵运算加速。
import numpy as np
= np.vectorize(reverse)
reverse_vec
def is_palindrome_vec(n):
return n == reverse_vec(n)
def max_palindrome_vec(n):
= n[is_palindrome_vec(n)]
num return np.max(num) if np.size(num) > 0 else None
def vectorized_palindrome(n):
= 0
largestPalindrome = np.arange(n//10, n)
x for i in x:
= max_palindrome_vec(i * x)
max_value if max_value is not None and max_value > largestPalindrome:
= max_value
largestPalindrome return largestPalindrome
答案
答案为906609。