【问题标题】:Pythagorean triples, not congruent毕达哥拉斯三元组,不全等
【发布时间】:2013-10-20 16:45:35
【问题描述】:
#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, 103, 4, 5 的组合,我不希望打印此值。我将如何更改程序以使其不打印另一个毕达哥拉斯三元组的任何组合?

【问题讨论】:

  • 并且 main() 应该返回 int。 int main(void)int main (int, char**) 提示:GCD
  • 我在想,可以说 n 是任意数字,如果 nana+ nbnb==ncnc 等于 a a+bb==cc 那么三元组将是彼此的组合,我只是不确定如何将其转换为代码。
  • 您可以尝试一定范围内的所有数字n,看看其中是否有任何一个产生重复的三元组。
  • 给定 a、b、c 三个数,当 GCD(a,b) ≠ 1 ∧ GCD(b,c) ≠ 1 ∧ GCD(c,a) ≠ 1 时(可能是三个 GCD 值必须是相同的值),那么你有一个非最小的解决方案。

标签: c


【解决方案1】:

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

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


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

m2 - n2, 2mn, m2 + n2

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


所以,你可以做的一件事是重构你的程序,让它循环遍历该范围内所有可能的 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 循环的结构也必须使“m-n 奇数”始终为真,但这并不需要太多。

【讨论】:

  • 为了做到这一点,我必须完全改变我的程序是你在说什么?正如我可以理解这将如何工作查看您提供的代码,但我真的不知道如何使用这些信息来更改我的代码以包含它。有什么建议吗?
  • 是的,它将包括重写。我提供的伪代码应该替换您代码中已有的三重嵌套 for 循环。这里的想法是,您不必遍历 0
  • +1,但是在您的伪代码中范围将关闭。如果我正确理解了最初的问题,那么m^2-n^22mnn^2 + m^2 中的所有三个都需要在给定范围内,而不是mn
  • @AleksG 这就是为什么我有脚注,“范围内”意味着m*m + n*n 小于限制,而不仅仅是mn。你想让我重写那一点更清楚吗?
  • 对不起,我一定错过了那一行。为我工作。
【解决方案2】:

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

#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);

          }
      }
  }
 }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多