毕达哥拉斯三倍运动

时间:2010-10-20 09:37:21

标签: algorithm

我需要快速提示以下练习题:

  

编写一个程序,生成所有毕达哥拉斯三元组,其小边不大于n。尝试使用n <= 200。

什么是“不等于n”?

运动来源:解剖学的Java(Ira Pohl和Charlie McDowell)

注意:我发现看起来非常好post on pythagorean triples但我不会读它,因为它可能会破坏我自己解决这个问题的尝试....

修改

如果n是小边a的长度,我们说:n是5; 然后我需要检查所有三元组a = 1,a = 2,a = 3,a = 4,a = 5 并找到毕达哥拉斯三元组的案例

这个额外条件有什么用呢?

编辑2

如果我向你展示一个实用的部分,也许我会更接近......所以这里有一小段(python)代码可以返回几个三元组。我已经将外循环的上限设置为20(现在我看不到'n'的任何其他用途)以保持其对该帖子的管理。

import math
for b in range(20):
    for a in range(1, b):
        c = math.sqrt( a * a + b * b)
        if c % 1 == 0:
            print (a, b, int(c))

返回

(3,4,5) (6,8,10) (5,12,13) (9,12,15) (8,15,17) (12,16,20)

是所需的输出?我错过了什么步骤?

提前致谢

巴巴

5 个答案:

答案 0 :(得分:2)

毕达哥拉斯三元组是直角三角形的整数边。三角形的小边是形成直角的边(意思不是斜边)。

no larger than n表示您获得了一个整数n,并且必须生成所有可能的整数三倍a b c,以a <= n, b <= na^2 + b^2 = c^2

答案 1 :(得分:1)

这个问题只是意味着如果我们假设'a','b'和'c'作为三角形的边和'c'是斜边的,那么'a'和'b'都应该小于'n'。

即。 a&lt; = n且b&lt; = n

答案 2 :(得分:1)

有无数的毕达哥拉斯三元组。因此,如果不在生成的三元组上放置边界,则程序无法在有限时间内完成任务。所以我们必须以某种方式限制所需的输出。关于所提供的界限是否适用于最短腿或双腿,似乎存在分歧。在这里,我们表明,限制最短的腿意味着另一条腿的界限。

我们可能会a <= b < c。由于我们知道sqrt(2)是不合理的,我们可以消除a = b,离开a < b < c的可能性。因为在毕达哥拉斯三元组中我们有a^2 + b^2 = c^2而a不是零,c >= b+1(即c至少与c可能的最小值一样大)。将c设置为与此边界一样小,我们得到a^2 + b^2 = c^2 >= (b+1)^2,这意味着a^2 >= 2b+1b <= (a^2 - 1)/2

因此,a上的约束也是b上的约束(因此也是c)。详细而言,如果我们需要a <= n,那么我们需要b <= (n^2 - 1)/2。我们可以进一步推断c^2 <= n^2 + (n^2 - 1)^2/4

c上的界限非常宽松,所以我不建议在c上循环,然后过滤掉太大的三角形。

答案 3 :(得分:0)

只存在有限数量的PT,其中最长边小于200“单位”,因此您可以遍历三边的每一边,整数列表从1到200(有一些基本的测试加快过程 - 这是练习 - 如果他们是PT - 那么你找到一个(记得忽略欺骗)。

答案 4 :(得分:0)

毕达哥拉斯三元组可以使用相当简单的公式自动生成。以下是一些讨论的网页:

另外,关于澄清“哪个小方面不大于n”的问题。假设三元组是(A,B,C),其中A <1。 B&lt; C.(C是hypoteneuse,A是短边,B是长边)

然后我会将要求解释为找到所有三元组,使得A <= n。 (B和C可能大于n)。这个问题应该更明确,并说“最短边”(“最短”优于“最小”)或明确地称为A和/或B.