为什么不';这些简单的Python程序不能工作:Euler4和Euler9
我在尝试Euler项目,但我被困在这一点上: 回文数字的两种读取方式相同。由两个两位数的乘积构成的最大回文是9009=9199 查找由两个3位数字的乘积构成的最大回文为什么不';这些简单的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
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循环。”人类的思维在发现模式方面非常出色,但有时这种能力对你不利。嵌套循环与你的问题无关。