我想回答以下问题 回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。
找出由两个3位数字的乘积制成的最大回文。
我的代码是:
for factorOne in range(100,1000):
for factorTwo in range(100,1000):
testNo = str(factorOne * factorTwo)
listNo = list(testNo)
length =len(listNo)
for callingNo in range(0,length):
if listNo[callingNo] == listNo[(length - 1) - callingNo]:
tempSol = int(testNo)
finalSol = 0
if tempSol > finalSol:
finalSol = tempSol
print(finalSol)
我只掌握python的基本知识,因为我只学习了大约两个星期,这是我得到的课程大约10个小时。 它给了我答案990009,我不完全确定为什么和其他人的解决方案太复杂,我不能理解。有人可以帮忙吗?
答案 0 :(得分:2)
您的错误在于您用来检查数字是否为回文的方法。生成factorOne * factorTwo * factorThree的产品后,您只需使用切片检查它是否是回文。
>>> a = '90009'
>>> a == a[::-1]
True
>>> b = '999000'
>>> b == b[::-1]
False
答案 1 :(得分:1)
您正在测试您的回文错误。你只是一次测试一个数字,如果那个数字匹配它的'镜像',你宣布它是一个回文。
例如,您的最高号码具有第一个和最后一个数字匹配。这意味着在您测试所有数字之前,第一次迭代中的if
测试为True
。
因为Python使得反转字符串变得微不足道,所以你要做的就是反对测试testNo
:
if testNo == testNo[::-1]:
# palindromic
在声明回文编号之前测试所有数字。
通过这种方法可以快速找到数字:
>>> found = 0
>>> for i in range(100, 1000):
... for j in range(100, 1000):
... candidate = i * j
... if str(candidate) == str(candidate)[::-1] and candidate > found:
... found = candidate
...
>>> found
906609
或使用max()
生成器表达式和itertools.product()
:
>>> from itertools import product
>>> max(i * j for i, j in product(range(100, 1000), repeat=2) if str(i * j) == str(i * j)[::-1])
906609
答案 2 :(得分:1)
for callingNo in range(0,length):
if listNo[callingNo] == listNo[(length - 1) - callingNo]:
# solved
此循环和测试的效果是在前两位数的检查通过后立即声明成功。如果第一个数字与最后一个数字相匹配,则找到解决方案。
您需要更改逻辑,以便在声明成功之前检查所有数字。换句话说,反转if
测试:如果测试失败,那么您知道您没有解决方案。如果传递,则您有潜在的解决方案,但您需要继续检查。