所以在数学课上我们遇到了这个问题:
你会得到一个边长4个单位的三角形。在三角形内部,存在由较大三角形的中段制成的较小三角形。共有8个内接三角形。总边长是多少?
所以,我决定看看我是否可以编写一个python程序来解决所有三角形和所有边长的问题。
这是:
tri = int(raw_input("How many triangles are there?\n>"))
size = int(raw_input("What is the side length of the biggest triangle?\n>"))
tot = 0
for i in range(1, tri):
tot += 3*(float(size/i))
print str(tot)
我尝试使用tri = 8和size = 4,就像原始问题一样,得到了24.0
。 As wolfram alpha shows us, that is wrong
为了澄清每一步中发生的事情,我将其编辑为:
tri = int(raw_input("How many triangles are there?\n>"))
size = int(raw_input("What is the side length of the biggest triangle?\n>"))
tot = 0
for i in range(1, tri):
tot += 3*(float(size/i+0.0000001))
print str(tot)
print str(tot)
输出结果为:
12.0000003
18.0000006
21.0000009
24.0000012
24.0000015
24.0000018
24.0000021
24.0000021
有人认为他们知道我哪里出错吗?
答案 0 :(得分:1)
您没有循环tri
次:
for i in range(1, tri):
结束值不包含在内,因此您在这里计算1
到7
,而不是8
。移除1
并在循环中添加1
:
for i in range(tri):
tot += 3.0 * size / (i + 1)
您只需在计算中使用一个浮点值,将3
转换为3.0
即可。不幸的是,在Python 2中,/
将使用整数或 floor 除以两个值为整数时,在Python 3中解决了一个问题:
>>> 1 / 2
0
>>> 1.0 / 2
0.5
在乘法中使用3.0
将确保除法的左侧操作数是浮点数。
您还可以使用脚本顶部的from __future__ import division
切换到/
运算符的正确除法,它始终返回浮点结果。
接下来,您未在公式中使用正确的 exponents ;它不是size / (i + 1)
;它是size / (2 ** i)
;你需要在这里除以2的幂;不除以1,2,3,4,而是1,2,4,8等:
tot = 0
for i in range(tri):
tot += 3.0 * size / 2 ** i
现在你得到一个匹配Wolfram Alpha的结果:
>>> tri, size = 8, 4
>>> tot = 0
>>> for i in range(tri):
... tot += 3.0 * size / 2 ** i
...
>>> tot
23.90625
答案 1 :(得分:0)
变化:
float(size/i)
为:
float(size)/i
答案 2 :(得分:0)
由于operator precedence in Python;
size/i+0.0000001
使用整数除法
size/i
然后添加0.0000001。实际上,它是
(size/i)+0.0000001
相反,请使用:
float(size)/i
强制浮点除法。