0

我想从 1 到 30、a 和 b 的每个数字组合中找出它们的毕达哥拉斯三元组。所有数字的限制是 30。输出从 14 开始。我不明白为什么。我真的很抱歉严重错误或格式错误。我刚刚开始 C。谢谢 :)

#include<stdio.h>
#include<math.h>
int main()
{
    float k;
    int i,j,sum;
    for(i=1;i<=30;i++)
    {
        for(j=1;j<=30;j++)
        {
            sum=(i*i)+(j*j);
            k=sqrt(sum);
            if(k>30.0)
            { 
                break;
            }           
            printf("Pythagorean Triplets are %d,%d,%f \n",i,j,k);

        }
    }
    return 0;
}

图片

4

1 回答 1

0

正如 Jonathan Leffler 已经在评论中所写,您需要测试相等性i*i + j*j == k*k。你不能直接这样做,因为它f是一个浮点数并且i,j是整数,你需要它们都是整数数据类型。没什么大问题,只要做一些事情就行了

#include <stdio.h>
#include <math.h>

int main(void)
{
  float k;
  int i, j, sum, k2;
  for (i = 1; i <= 30; i++) {
    for (j = 1; j <= 30; j++) {
      sum = (i * i) + (j * j);
      // you have "float k", hence "sqrtf()" instead of "sqrt()"
      // which is for "double"s
      k = sqrtf(sum);
      // floating point numbers with any notes are "double"s,
      // hence the "F" at the end
      if (k > 30.0F) {
        break;
      }
      // this may not work for very large values but you have 30
      // as your upper limit which is low enough
      k2 = (int) floorf(k);
      if (k2 * k2 == sum) {
        // use 2 digits for the format, makes it a bit more readable
        printf("Pythagorean Triplets are %2d, %2d, %2d\n", i, j, k2);
      }
    }
  }
  return 0;
}

此处可以省略其他强制性的错误检查,因为输入是已知的,并且众所周知的是始终有效。

但是该列表仍然比预期的要大,它包含双峰,例如:3, 4, 5但是4, 3, 5我将把它作为 OP 的练习。

于 2017-06-20T18:22:33.473 回答