为什么以下(查找毕达哥拉斯三胞胎)代码不起作用

时间:2018-07-09 13:12:34

标签: c

#include <stdio.h>
int main(){
int a=1,b=1,c=1,d,e;

for(a=1;a<=30&&b<=30&&c<=30;a++)

{for(b=1;a<=30&&b<=30&&c<=30;b++)

{
for(c=1;a<=30&&b<=30&&c<=30;c++)
{d=(a*a)+(b*b);
e=(c*c);
if(e==d)
printf("\n %d   %d    %d",a,b,c);

}

}


}

}

问题是要打印所有三边形小于30的三胞胎;但是上面的代码没有给出输出

2 个答案:

答案 0 :(得分:1)

如果您要查找“毕达哥拉斯三元组”,则必须在相应的while循环之前重置变量

#include <stdio.h>
int main() 
{
    int a = 1, b = 1, c = 1, d;
    while (a <= 30)
    {
        b = 1;
        while (b <= 30)
        {
            c = 1;
            while (c <= 30)
            {
                d = (a*a) + (b*b);
                if (d == c * c)
                    printf("the triplet is a =%d  b=%d   c=%d \n", a, b, c);

                c++;
            }
            b++;
        }
        a++;
    }
}

答案 1 :(得分:1)

在您的代码示例中,您正在使用三个while循环,其中a,b和c的初始状态设置为循环的外部。

在第一次运行时,a和b将为1。一旦运行了内部while循环,c就会递增直到它为31,而a和b仍为1。

现在,您的目标是运行所有组合。但是,检查三元组的while循环将永远不会再运行,因为c现在为31并且满足while循环的条件。结果,b会升至31,然后是a。

要纠正,请使用三个for循环,如下所示:

int main(){
    for(int i = 1; i <= 30; i += 1)
    {
        for(int j = 1; j <= 30; j += 1)
        {
            for(int k = 1; k <= 30; k += 1)
            {

                int d=(i*i)+(j*j);
                if(d==k*k)
                {
                    printf("the triplet is i =%d  j=%d   k=%d \n",i,j,k);
                }
            }
        }
    }
}

或者,重置您的a,b和c(请参阅L_J的答案)