为什么我的项目euler#4程序无效?

时间:2014-09-17 20:08:26

标签: python

我想回答以下问题 回文数字两种方式相同。由两个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,我不完全确定为什么和其他人的解决方案太复杂,我不能理解。有人可以帮忙吗?

3 个答案:

答案 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测试:如果测试失败,那么您知道您没有解决方案。如果传递,则您有潜在的解决方案,但您需要继续检查。