Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';这些简单的Python程序不能工作:Euler4和Euler9_Python - Fatal编程技术网

为什么不';这些简单的Python程序不能工作:Euler4和Euler9

为什么不';这些简单的Python程序不能工作:Euler4和Euler9,python,Python,我在尝试Euler项目,但我被困在这一点上: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=9199 查找由两个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 = tes

我在尝试Euler项目,但我被困在这一点上:

回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=9199

查找由两个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循环。这可能与此有关吗?

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

test2 = test[2:]                #take last two numbers
没有说明注释所说的内容–这一行从字符串中去掉前两个字符,只留下最后一个数字。不要固定此行,只需检查整个字符串是否等于反向字符串:

if test == test[::-1]:
在第二个示例中,将近似浮点数与精确整数
1000
进行比较。因为浮点数会有舍入错误,所以找不到精确匹配。请参见Python教程中的

您应该将
c
四舍五入到最接近的整数,使用纯整数算法检查它们是否真的是勾股三元组,然后测试总和是否为1000


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

第二个问题:简单错误;c是一个浮点数,您将a+b+c与1000进行比较;提升到浮点数会得到一个浮点数,例如(3**2+4**2)**0.5==5.0对于第二个问题,您的范围不够大。如果a和b的最大值是31,那么c的最大值可以是(31^2+31^2)^0.5,因此a+b+c的总和可能是(2+sqrt(2)*31,小于1000


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

虽然我同意舍入错误通常会导致问题,但这并不是问题的根源。OP只是搜索不够高。@DSM:对,也是这样。因此有两个bugs需要修正。我想我会使用
c=1000-a-b
如果a**2+b**2==c**2
,而不是取整
c
;这样我们总是保持整数。@DSM:我试图尽可能接近OP的方法。我会使用毕达哥拉斯三元组的经典参数化,这样我就不用检查了。赖特。我不是sea对于第二个,拱形足够高。对于第一个,谢谢Sven,我尝试了if test=test[::-1]。而且?这不是问题。“但我注意到它们都有嵌套for循环。”人类的思维在发现模式方面非常出色,但有时这种能力对你不利。嵌套循环与你的问题无关。