4
#include <stdio.h>

void main ()
{

  int a = 0, b = 0, c = 0, n;
  int counter = 0;

  printf("Please Enter a Positive Integer: \n");
  scanf("%d", &n);

  for (c = 0; c < n; c++)
  {
      for (b = 0; b < c; b++)
      {
          for (a = 0; a < b; a++)
          {
              if (a * a + b * b == c * c )
              {
                printf("%d: \t%d %d %d\n", ++counter, a, b, c);
              }
          }
      }
  }

}

该程序计算给定整数 n 中有多少毕达哥拉斯三元组。

这也包括所有一致的三元组。

我想更改程序,使其不包括相互组合的三元组,我不知道该怎么做,有什么提示吗?

例如,当15输入整数时,将打印以下内容:

3, 4, 5

6, 8, 10

5, 12, 13

6, 8, 10是的组合,3, 4, 5我不想打印这个值。我将如何更改程序以使其不打印另一个毕达哥拉斯三元组的任何组合?

4

2 回答 2

6

虽然你可以遍历所有的三元组,并且只保留一个如果它与之前的三元组之一不一致(即如果边长不共享一个公因数),但如果你改变程序可能会更容易所以它只找到三个边长不共享公因数的三元组。这样,3, 4, 5会找到一个三重类似的,但它会6, 8, 10完全“跳过”。

警告:我的建议是大修。如果您只想要“小的”更改,那么这可能不是您想要的。


首先,一点背景。边长互质的毕达哥拉斯三元组称为原始毕达哥拉斯三元组。欧几里得定理指出,如果 m 和 n 是互质整数且 mn 是奇数,则

m 2 - n 2 , 2mn, m 2 + n 2

是原始毕达哥拉斯三元组的边长。此外,所有原始毕达哥拉斯三元组都是这种形式。


因此,您可以做的一件事是重组您的程序,使其循环遍历该范围内所有可能的 m 和 n,然后打印和递增计数器。像这样的东西:

for all m within range
    for all n greater than m (but still within range)
        if gcd(m,n) = 1
            print out m*m - n*n, 2*m*n, and m*m + n*n
            increment the counter

其中在范围内意味着m*m + n*n仍然小于您作为输入读入的任何限制。for 循环也必须构造成“mn 奇数”总是正确的,但这并不需要太多。

于 2013-10-20T17:12:03.970 回答
0

以下对您的代码的修改应该可以解决它:

#include <stdio.h>

void main ()
{

int a = 0, b = 0, c = 0, n,i,flag;
int counter = 0;

printf("Please Enter a Positive Integer: \n");
scanf("%d", &n);

for (c = 0; c < n; c++)
{
  for (b = 0; b < c; b++)
  {
      for (a = 0; a < b; a++)
      {
          if (a * a + b * b == c * c )
          {
            flag=0;


                    for(i=2; i < c ; i++)
                    {
                            if(a%i==0 && b%i==0 && c%i==0)
                            {
                            flag = 1;
                            break;
                            }
                    }
                    if(flag)
                    continue;
                    printf("%d: \t%d %d %d\n", ++counter, a, b, c);

          }
      }
  }
 }

}
于 2014-01-01T02:53:21.643 回答