勾股数练习题

4
我需要关于以下练习问题的快速提示:
编写一个程序,生成所有小边不大于n的勾股三元组。尝试使用n <= 200。
“不大于n”是什么意思?
练习来源:Java by Dissection(Ira Pohl和Charlie McDowell)
注意:我发现了一个看起来非常好的有关勾股三元组的文章,但我还不想读它,因为它可能会破坏我自己解决这个问题的尝试...
编辑
如果n是小边a的长度,我们说:n是5; 然后我需要检查所有的三元组,其中a = 1,a = 2,a = 3,a = 4,a = 5,并找到勾股三元组的情况。
这个额外的条件有什么用?
也许如果我展示一个实用的代码片段,你会更加接近理解……这里有一小段(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)

这是期望的输出吗?我错过了哪一步?

提前感谢

Baba


1
尝试使用 n <= 200,这有帮助吗? - SilentGhost
对于0<a<=20,a<b<c,三元组的集合为{{3, 4, 5},{5, 12, 13},{6, 8, 10},{7, 24, 25},{8, 15, 17},{9, 12, 15},{9, 40, 41},{10, 24, 26},{11, 60, 61},{12, 16, 20},{12, 35, 37},{13, 84, 85},{14, 48, 50},{15, 20, 25},{15, 36, 39},{15, 112, 113},{16, 30, 34},{16, 63, 65},{17, 144, 145},{18, 24, 30},{18, 80, 82},{19, 180, 181},{20, 21, 29},{20, 48, 52},{20, 99, 101}}。这只是一个健全性检查和小限制下的测试集。 - Eric Towers
对于0<a<=200,a<b<c,有711个三元组。最后一个是{200, 9999, 10001}。再次强调,这是对您用于生成这些三元组的任何方法进行的一项合理性检查。 - Eric Towers
@Baba:你的问题已经远远超出了最初的范围。你可能想要关闭它并重新开始。 - SilentGhost
嗨,Silent Ghost,所有的答案都很好。然而,我觉得“三边均不大于n”的语句仍然不清楚。如果我只有a、b、c,那么n从哪里来? - user425727
PS:Eric下面的回答确实是一个好提示,但它偏离了数学证明“限制最短腿意味着对另一条腿有一个限制”的陈述,这对我并没有帮助,因为我正在寻找一个更简单的答案。我从中得到练习的书籍作者肯定没有想到那么复杂的东西。 - user425727
5个回答

2
勾股三元组是直角三角形的整数边。三角形的小边是形成直角的两条边(不是斜边)。
“不大于n”意味着给定一个整数n,必须生成所有可能的整数三元组a b c,使得a <= n,b <= n且a^2 + b^2 = c^2。

好的,如果我取三元组(3,4,5),那么n的范围是1到3? n的意义是什么呢?或者换句话说:除了练习本身之外,它还有其他目的吗?我认为Richard在上面已经解释过了……需要更多时间思考,但谢谢。 - user425727
问题在于这个问题有些模糊不清。 "small sides" 中的复数"s" 可能指的是每个复数勾股三元组的一个小边。 - Jason S
@Baba:不,对于你的例子(3,4,5),n的范围是1到4,因为两个较小的边都小于或等于4。 - Matt Ellen
我会遵循Silent Ghost的建议并关闭这个帖子。感谢大家的回答。我认为我需要以不同的方式重新表述我的问题,因为我似乎仍然在原地打转:( - user425727

1
这个问题的意思是,如果我们假设'a'、'b'和'c'是三角形的边,'c'是斜边,那么'a'和'b'都应该小于'n'。
也就是说,a <= n且b <= n。

"小边" -- 我会将 'a' 解释为小边。 - Jason S
1
你应该修复你的不等式,它们肯定是“<=”而不是“<”。 (3并不比3大,所以相等满足要求。) - Jason S
我同意Jason的观点,'n'代表每个三元组中小的一边'a'。 - user425727
虽然有些含糊,但我理解这个问题的意思是a和b都不大于n。这只是一个练习 - 两种方式都试一下。 - Keith Randall
1
@baba - 只是一个想法,你不知道a、b和c的值。但在编程时,你可以假设a小于n,但b呢?如果没有对b设置限制,它可以是任何值。这就是为什么我认为条件语句中说,你的a和b都需要小于n。这是为了给你的结果定义一个明确的边界。 - Sachin Shanbhag

1

勾股三元组有无限多个。因此,如果您不对要生成的三元组集合进行限制,程序就无法在有限时间内完成任务。所以我们必须以某种方式限制所需的输出。在这里,我们展示了将最短边加上限制,就意味着限制了另一条边。

我们可以取 a <= b < c。由于我们知道sqrt(2)是无理数,可以排除a = b的可能性,从而得到 a < b < c。由于在勾股三元组中,我们有 a^2 + b^2 = c^2且a不为零,c >= b+1(即c至少与可能的最小值一样大)。把c作为这个限制的最小界限,我们得到a^2 + b^2 = c^2 >= (b+1)^2,这意味着a^2 >= 2b+1或者b <= (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上循环,然后过滤掉太大的三角形。

0

只有有限数量的直角三角形存在,其中最长边小于200个“单位”,因此您可以迭代三条边的每一条边,从1到200的整数列表(通过一些基本测试来加速过程-这就是练习)-如果它们是直角三角形-那么你找到了一个(记得忽略重复项)。


那是暴力方法。有更高效的方式来解决这个问题。 - Jason S

0

可以使用相当简单的公式自动生成勾股三元组。以下是一些讨论此问题的网页:

另外,关于澄清“其小边不大于n”的问题。假设三元组为(A,B,C),其中A<B<C。(C是斜边,A是短边,B是长边)

那么我会将要求解释为找到所有满足A≤n的三元组。(B和C可能大于n)。问题应该更明确地说明“最短边”(“最短”比“最小”更好),或者明确指出A和/或B。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接