使用有序数组求解勾股定理(Python)
在毕达哥拉斯定理中,斜边是最长的长度。我能够对数组进行排序,自动将值从最小到最大排序。现在,问题是如何处理这些值?程序中的用户不知道最长的长度(用户输入坐标),计算机绘制三个点的图形,并使用距离公式查看三条边之间的长度 下面是可以对值进行排序的代码使用有序数组求解勾股定理(Python),python,arrays,Python,Arrays,在毕达哥拉斯定理中,斜边是最长的长度。我能够对数组进行排序,自动将值从最小到最大排序。现在,问题是如何处理这些值?程序中的用户不知道最长的长度(用户输入坐标),计算机绘制三个点的图形,并使用距离公式查看三条边之间的长度 下面是可以对值进行排序的代码 #result3, result2, result are leg measurements brandonarray[result3,result2,result] brandonarray.sort(key=int) 因此,例如,如果用户绘制3
#result3, result2, result are leg measurements
brandonarray[result3,result2,result]
brandonarray.sort(key=int)
因此,例如,如果用户绘制3个随机点(让我们使用(3,5)、(10,10)、(19,20))
我让程序打印阵列距离数字
#result3 was 8, result2 was 13, result was 21
[8,13,21]
如果我插入这三个数字,我知道它会起作用。我让程序告诉你这些腿的尺寸会使它成不等边,它是一个钝角三角形
但是,如果用户在不注意边长的情况下提出了这些观点,又会怎样呢
#all of these are strings b/c in the beginning of program, user has input
joe=str(float(result3)**int(2))
sally=str(float(result2)**int(2))
print(str(float(result3)**int(2)),"+",float(result2)**int(2),"=",float(result)**int(2))
print("")
print(str(float(joe)+float(sally)),"=",str(float(result)**int(2)))
#this code no matter what, will take the number its assigned too, regardless if its bigger than the hypotenuse
if(str(float(joe)+float(sally))>str(float(result)**int(2))):
print("This is an acute triangle!")
elif(str(float(joe)+float(sally))<str(float(result)**int(2))):
print("This is an obtuse triangle!")
elif(str(float(joe)+float(sally))==str(float(result)**int(2))):
print("This is an right triangle!")
#所有这些都是程序开头的b/c字符串,用户有输入
joe=str(浮动(结果3)**int(2))
sally=str(float(result2)**int(2))
打印(str(float(result3)**int(2)),“+”,float(result2)**int(2),“=”,float(result)**int(2))
打印(“”)
打印(str(float(joe)+float(sally)),“=”,str(float(result)**int(2)))
#不管怎样,这个代码也会取它指定的数字,不管它是否大于斜边
如果(str(float(joe)+float(sally))>str(float(result)**int(2)):
打印(“这是一个锐角三角形!”)
elif(str(float(joe)+float(sally))我认为这可能是一个更好的方法,假设您的三个长度当前是变量x
、y
和z
中的数字(整数或浮点,甚至字符串):
x = float(x) # convert from int or string if necessary
y = float(y)
z = float(z)
x, y, z = sorted([x, y, z])
a = x * x + y * y
b = z * z
if a < b:
print("obtuse")
elif a > b:
print("acute")
else: # a == b
print("right")
x=float(x)#必要时从int或string转换
y=浮动(y)
z=浮动(z)
x、 y,z=已排序([x,y,z])
a=x*x+y*y
b=z*z
如果ab:
打印(“急性”)
其他:#a==b
打印(“右”)
然而,请注意,由于浮点运算的不精确性,检测直角三角形时会出现一些失败,因为,例如,25.0!=25.000000000001…如果您想避开这个问题,您需要使用类似于的东西,如果abs(a-b)
对于一些适当小的epsilon
如果没有前三行,代码应该可以正确地处理所有整数值,因为这样所有计算值都将是整数(或long
s),并且算法应该是精确的。代码中有太多转换floatintstr。您应该能够删除其中的大部分。特别是int(2)brandonarray[result3,result2,result]
?你的意思是brandonarray=[result3,result2,result]
?就像@Elazar说的:不要过度使用构造函数转换。特别是,想象一种情况,joe=2
和sally=10
。然后str(joe)>str(sally)
.Oops!您的描述建议您从整数坐标开始。在这种情况下,不要执行平方根运算,而是保留平方值,只进行整数运算。这样您就不会失去精度。了解它,热爱它,再也不会因为不精确的表示而遭受不精确的痛苦。@MatthewCole是的,如果它真的是不精确的话,也是这样考虑到问题中的示例代码和数字,我有点犹豫是否要提出这个问题,因为尽管这个包很好,但它确实引入了一点复杂性。。。