0

谁能告诉我以下代码有什么问题。它没有显示任何结果。

整数 a,b,c 是直角三角形的边。(正在解决 Project Euler 问题 39)

如果我使用 || 代替 && ,它根据 || 显示所需的结果 健康)状况。但不适用于 && 条件

public static void main(String[] args)  {
    int a,b,c;
    for (a=1;a<120;a++){
        for(b=120;b>0;b--){
            c= 120-(a+b);
            if (((c) > (a+b)) && ((c*c)==(a*a)+(b*b))){
                    System.out.println(a + " , " + b +" , " + c);
                    System.out.println("**************");

                }
            }   
        }
    }
4

5 回答 5

4

很简单,因为这个表达式:

((c) > (a+b))

...永远不会在您的示例中为任何有效的直角三角形返回 true,并且由于 && 条件要求两个操作数都评估为 true,因此不会执行 if 语句。

如果您输入以下几行,您可以清楚地看到这一点:

System.out.println("C: " + c);
System.out.println("A+B: " + a+b);
于 2013-05-15T09:14:38.853 回答
1

&& 条件的第二部分如果首先为真,则将始终为假。如果 c > (a+b) 那么 c*c > (a+b)*(a+b) => c^2 > a^2 + b^2 + 2ab 那么 c^2 != a^2 + b ^2

于 2013-05-15T09:16:02.703 回答
0

a+b 不总是 121 吗?使 c 始终为 -1,使 c > a+b 成为不合逻辑的比较?你想在这里做什么?

无论如何,在每个 { 之后添加一些 System.outs ,这样你就知道发生了什么。还要添加 System.out.println( c + " " + a + " " + b + " " + (a+b) + " " + (c*c) + " " + ((a*a)+(b *b))); 查看比较中的所有参数,以确保在if本身之前获得预期的结果。

于 2013-05-15T09:14:48.817 回答
0

从数学上讲,这两个条件永远不会为真,这就是 && 结果为假和 || 的原因。在某种情况下,条件之一为真。

(c > (a+b)) && (c*c==(a*a)+(b*b))

如果一个数大于两个数的和,则该数的平方也将大于两个数的平方和。

于 2013-05-15T09:15:27.477 回答
0

尝试这个

        int a,b,c;
        for (a=1;a<120;a++)     {     
            for(b=120;b>0;b--){
                c= 120-(a+b);
                System.out.println(c+">"+(a+b)+" && "+(c*c)+" == "+((a*a)+(b*b)));
                if (((c) > (a+b)) && ((c*c)==(a*a)+(b*b))){
                        System.out.println(a + " , " + b +" , " + c);
                        System.out.println("**************");

                    }
                }        
            }
        }

并检查自己

IE

-66>186 && 4356 == 17330
-65>185 && 4225 == 17137
-64>184 && 4096 == 16946
-63>183 && 3969 == 16757
-62>182 && 3844 == 16570
-61>181 && 3721 == 16385
-60>180 && 3600 == 16202
-59>179 && 3481 == 16021
-58>178 && 3364 == 15842

...

于 2013-05-15T09:18:38.687 回答