找到毕达哥拉斯三元组(a,b,c),其中< = 200

时间:2010-10-21 20:52:14

标签: algorithm

在我关于这个主题的previous post中,我没有取得什么进展(除了我自己以外没有责怪任何人!)所以我会尝试以不同的方式处理我的问题陈述。

我如何编写算法来生成原始三元组列表?

所有我必须开始的是:

a)基本定理:a^2 + b^2 = c^2

b)三重(a和b)的小边需要小于'n'的事实

(注意:'n'< = 200为此目的)

我如何构建循环?我需要2个或3个循环吗?

一位教授给了我一些提示但是我仍然迷失了。我不知道从哪里开始构建我的循环。我需要2个或3个循环吗?我是否循环a和b或者我是否需要将'n'变量引入自己的循环中?对于有经验的程序员来说,这可能看起来很明显,但似乎我还需要更多的手握......任何帮助都将受到赞赏!

  毕达哥拉斯三重奏是a,b,c的组   其中a ^ 2 + b ^ 2 = c ^ 2。你需要   找到所有的a,b,c组合   满足上述规则开始   0,0,0到200,609,641第一个   三重将是[3,4,5]下一个将   是[5,12,13]等.n是长度的   如果n是5你需要的那么小的一面   检查所有三元组   a = 1,a = 2,a = 3,a = 4,a = 5并找到两者   上面显示的案例是   毕达哥拉斯,

修改

感谢所有提交。所以这就是我提出的(使用python)

import math
for a in range (1,200):
    for b in range (a,a*a):
        csqrd = a * a + b * b
        c = math.sqrt(csqrd)
        if math.floor(c) == c:
                print (a,b,int(c))

这个DOES返回三元组(200,609,641),其中200是'a'的上限,但计算'b'的上限仍然很棘手。不知道我怎么会这样...建议欢迎:))

由于

巴巴

P.S。我不是在寻找解决方案,而是帮助提高解决问题的能力。 (绝对需要:-))

6 个答案:

答案 0 :(得分:1)

你只需要两个循环。请注意,n已给出,这意味着您从键盘或文件中读取

阅读n后,您只需从1循环a,然后在该循​​环中从b循环a。然后,检查是a <= n还是b <= n。如果是,则检查a^2 + b^2是否为正方形(如果它可以写为c^2,其中c是整数)。如果是,则输出相应的三元组。您可以在a > n之后停止第一个循环,在b > n之后停止第二个循环。

答案 1 :(得分:1)

要计算b的上限...当然我们不能超过^ 2 + b ^ 2 =(b + 1)^ 2,因为连续方块之间的间隙增加。现在,(b + 1)^ 2是b ^ 2 + 2b + 1,所以我们可以在a ^ 2&lt; 2b + 1.(事实上,对于奇数a,最大三元组是当b =(a ^ 2 - 1)/ 2,然后a ^ 2 + b ^ 2 =(b + 1)^ 2。)

让我们考虑一下。然后,我们需要考虑a ^ 2 + b ^ 2 =(b + 2)^ 2,因为2b + 1必然是奇数。现在,(b + 2)^ 2 - b ^ 2 = 4b + 4,所以我们看a ^ 2 = 4b + 4,或b =(a ^ 2 - 4)/ 4作为最高b(和和以前一样,我们知道这个有效。)

因此,对于给定的a,您需要检查bs到

(a ^ 2 - 1)/ 2(奇数)

(a ^ 2 - 4)/ 4(偶数)

答案 2 :(得分:0)

单独留下公式和语言,你试图找到两个变量的每个组合,a和b所以......

foreach A   
  foreach B  
    foreach C
      do something  with B and A  and eval with c  
    end foreach C  
  end foreach B  
end foreach A
for ($x = 1; $x <= 200; $x++) {
    for ($y = 1; $y <= 200; $y++) {
        for ($z = 1; $z <= 200; $z++) {
            if ($x < $y) {
                if (pow($x, 2) + pow($y, 2) == pow($z, 2)) {
                    echo "$x, $y , $z<br/>";
                }
            }
        }
    }
}

3,4,5 5,12,11
6,8,10 ......

81,108,135
84,112,140
84,135,159

答案 3 :(得分:0)

给定任何a和b,你可以计算c应该是什么。您还可以检查您获得的c是否为整数。考虑到这一点,您需要检查所有a和b值并找到能够给出整个c值的值。

这应该只需要两个循环(一个用于a,一个用于b)。如果您需要更多帮助,请留下评论,并告诉我您遇到的问题。

答案 4 :(得分:0)

因此,毕达哥拉斯的幸运儿有两个属性可以解决这个问题:

首先,三元组中的所有数字必须是整数(这意味着,您可以计算a^2 + b^2,如果c^2是整数而不是浮点数,则您有三元组。此外,cab的限制。

所以这应该告诉你你有多少变量(这将指导你的算法设计 - 特别是你需要多少个循环)。后一条信息将告知您需要迭代多长时间。我根据你的要求试图模糊不清,但如果你想要更具体的东西,请告诉我。

答案 5 :(得分:0)

将问题分解为子问题。第一个线索是,n的值上限为c。让我们从c=1开始---所以,让我们看看可以形成多少三元组:

a^2 + b^2 = 1

现在,让我们设置a = 1 to c-1。这意味着我们必须检查b是否为b^2 = c^2 - a^2b^2 = int(b)^2的整数。