我的项目欧拉第四题程序为什么不能运行?

2024-04-26 20:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着回答以下问题 回文数字的两种读法相同。由两个两位数的乘积构成的最大回文数为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的基本知识,因为我只学了大约两个星期的python,加上我所学的课程,大概有10个小时。 它给了我答案990009,我不完全清楚为什么和其他人的解决方案太复杂,我不明白。有人能帮忙吗?你知道吗


Tags: inforifrange数字length乘积listno
3条回答

您的错误在于用于检查数字是否为回文的方法。一旦生成了factorOne*factorTwo*factortree的乘积,就可以简单地使用切片检查它是否是回文。你知道吗

>>> a = '90009'
>>> a == a[::-1]
True

>>> b = '999000'
>>> b == b[::-1]
False

你的回文测试不正确。你一次只测试一个数字,如果这一个数字和它的“镜像”匹配,你就声明它是回文。你知道吗

例如,您的最高数字的第一个和最后一个数字是匹配的。这意味着您在第一次迭代中的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
for callingNo in range(0,length):
    if listNo[callingNo] == listNo[(length - 1) - callingNo]:
        # solved

这个循环和测试的效果是在前两个数字的检查通过后立即宣布成功。如果第一个数字和最后一个数字匹配,就这样,找到了解决方案。你知道吗

您需要更改逻辑,以便它在声明成功之前检查所有数字。换句话说,反转if测试:如果测试失败,那么您就知道您没有解决方案。如果通过,则有一个电势解,但需要继续检查。你知道吗

相关问题 更多 >