0

我正在尝试 Project Euler 并坚持这个:

回文数的两种读法都是一样的。由两个 2 位数字的乘积构成的最大回文数是 9009 = 91 99。

找出由两个 3 位数字的乘积构成的最大回文数。

for i in range(1000,100,-1):
    for j in range(1000,100,-1):
        test = i*j
        test = str(test)                #turn product into string
        test2 = test[2:]                #take last two numbers
        test2 = test2[::-1]             #flip them
        if test[:2] == test2:           #if it's a palindrome, the first two should 
            print(i, "\t", j)           #match the flip of last two

input("\n\nPress the ENTER key to exit.")

运行时没有任何反应:命令行计算,但不打印任何内容。该程序确实结束了。

我知道更大的数字不仅仅是第一个和最后两个数字,但应该有足够的回文数,我可以通过它们查看。

这是下一个:

求和为 1000 的毕达哥拉斯三元组。a^2 + b^2 = c^2, a+b+c=1000

for a in range(1,32):
    for b in range(1,32):
        c = (a**2 + b**2)**.5
        if a + b + c == 1000:
            print(a,"\t",b,"\t",c)
input("\n\nPress the ENTER key to exit.")

与上一个程序一样,没有输出……但同样,它确实结束了。但我注意到它们都嵌套了 for 循环。这可能与它有关吗?

4

3 回答 3

2

你的两个测试都是错误的。在第一个示例中,行

test2 = test[2:]                #take last two numbers

没有说明注释所说的内容——这一行从字符串中去掉了前两个字符,只留下最后一个数字。无需修复此行,只需检查整个字符串是否等于反转字符串:

if test == test[::-1]:

在第二个示例中,您将近似浮点数与精确整数进行比较1000。由于浮点数会有舍入误差,因此您找不到完全匹配的值。另请参阅Python 教程中的浮点算术:问题和限制

您应该四舍五入c到最接近的整数,使用纯整数算术检查它们是否真的是毕达哥拉斯三元组,然后测试总和是否为 1000。

正如 DSM 在评论中指出的那样,您的循环也会提前停止。这些值的最大总和约为 106。

于 2012-07-18T14:48:29.037 回答
0

对于第二个问题:简单的错误;c 是一个浮点数,并且您将 a+b+c 与 1000 进行比较;提高到浮点数给出一个浮点数,例如 (3**2+4**2)* *0.5 == 5.0

于 2012-07-18T14:52:07.630 回答
0

对于第二个问题,你没有足够大的范围。如果a和b的最大值是31,那么c的最大值可以是(31^2 + 31^2)^0.5,所以a + b + c的和你可能有是(2 + sqrt(2 ) * 31,小于 1000。

至于浮点问题,请确保使用 int() 函数将 c 转换为整数。这可能会与舍入错误产生一些重叠(当我尝试该解决方案时,我认为这对我没有影响),但是即使您手动执行,也应该很容易检查您得到的少数结果是否正确在一分钟的限制内。

于 2012-07-18T15:07:03.807 回答