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

标签 c loops for-loop

所以我正在尝试编写一个程序,循环遍历三角形 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/

相关文章:

javascript - 这个 for 循环如何工作和结束?

c# - 传递 DataGridViewRow 作为引用

c - 在 C 中将函数标记为内联是否会导致所有调用的函数都被隐式标记为内联?

jquery - 将对象转换为单独模型的最佳方法是什么

C:亮黄色和亮绿色(ncurses)?

c++ - 带映射迭代器的 For 循环退出条件

javascript - 如何计算每个条件的循环次数并将其存储到数组中?

ios - Swift for 循环不起作用

c - ADXL345只读ceros

c - 如何将 typedef 结构数组的变量复制并传输到另一个 - C