gpt4 book ai didi

c - 勾股定理测试不起作用?

转载 作者:太空狗 更新时间:2023-10-29 15:35:24 25 4
gpt4 key购买 nike

所以我正在尝试编写一个程序,循环遍历三角形 3 条边的边长的所有可能组合,并打印遵循勾股定理的边长组合(即 sideA(sqr) + sideB(sqr) =斜边(平方))。那些匹配的,它应该打印。然而,数学并没有按照它应该的方式执行。我认为问题在于我如何设置循环。

那么我的问题是,我应该如何设置它?因为我的印象是 for 循环以下列方式执行:

最外层的循环会检查毕达哥拉斯条件是否满足。如果是,它会打印结果、递增并再次测试。当条件不满足时,它会转移到第二个for循环,重复相同的过程,此时第二个循环转移到第三个,最里面的for循环。在那里,它会一直增加到 500,测试并打印每个适用的结果,一旦完成,它就会传回中间循环。中间循环递增,再次测试,一旦条件不成立,代码将转移到最内层循环并重复该过程,只是这次更改了中间循​​环变量(即正在测试新的数字集。 ) 整个过程一直重复,直到第2个for循环一直递增到500,这时转入最外层循环,一直重复这个过程。最外层循环递增,直到不再满足条件,然后它转移到中间循环,并且 2 个内部循环再次执行它们的过程,只是这次使用更改的外部 for 循环变量(即再次测试新的可能性)。

在此方面的任何和所有帮助将不胜感激。我很想继续,但我觉得嵌套循环的概念是理解的关键,我不想在这方面卖空自己。

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

int main(void) {

int sideA = 1;
int sideB = 1;
int hypotenuse = 1;

for (hypotenuse = 1; hypotenuse <= 500; hypotenuse++) {
if ( (hypotenuse * hypotenuse) == ( sideA * sideA + sideB * sideB) ) {
printf("%d, %d, %d\n", sideA, sideB, hypotenuse);
}

else {
for (sideA = 1; sideA <= 500; hypotenuse++) {
if ( (hypotenuse * hypotenuse) == ( sideA * sideA + sideB * sideB) ) {
printf("%d, %d, %d\n", sideA, sideB, hypotenuse);
}

else {
for (sideB = 1; sideB <= 500; sideB++) {
if ( (hypotenuse * hypotenuse) == ( sideA * sideA + sideB * sideB) ) {
printf("%d, %d, %d\n", sideA, sideB, hypotenuse);
}
}
}
}
}
}
}

最佳答案

打字错误 for (sideA = 1; sideA <= 500; hypotenuse++) .

另外,如果太多,你不需要这些。

#include <stdio.h>

int main(void)
{
int sideA, sideB, hypotenuse;

for (hypotenuse = 1; hypotenuse <= 500; hypotenuse++)
for (sideA = 1; sideA <= 500; sideA++)
for (sideB = 1; sideB <= 500; sideB++)
if ((hypotenuse * hypotenuse) == (sideA * sideA + sideB * sideB))
printf("%d, %d, %d\n", sideA, sideB, hypotenuse);
}

http://ideone.com/P01jxB

此外,观察您的代码中会发生的一些行为:

  1. 第一次循环后,sideAsideB第一个使用 if不会是1再多了,他们甚至可能越界 (501)。
  2. 如果逻辑属于那些 if 中的任何一个 | s,您不会为其他值运行测试。

至于性能,请注意这个嵌套循环总共运行了 1.25 亿 次 (500 * 500 * 500)。这可以通过多种方式进行优化,包括使用您包含但未使用的库的几个函数,math.h :

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

int main(void)
{
int a, b;
for (a = 1; a <= 500; a++)
for (b = a; b <= 500; b++) // b starts from a, not 1
{
double h = sqrt(a * a + b * b);

if (h > 500.0) // hypotenus is bigger than 500, stop the loop
break;

if (fmod(h, 1) == 0.0) // only print if hypotenuse is an integer value
{
printf("%d, %d, %d\n", a, b, (int)h);
printf("%d, %d, %d\n", b, a, (int)h); // print both ways around, optional
}
}
return 0;
}

http://ideone.com/DZFa3s

这应该会重现相同的结果(尽管顺序不同),而且速度更快,总共只运行了大约 98,000 次循环。

关于c - 勾股定理测试不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30197502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com