为何这段寻找毕达哥拉斯三元组的Java代码无法运行?
排查你的毕达哥拉斯三元组Java代码问题
我帮你梳理下代码里的几个关键问题,这些问题要么导致编译失败,要么让你找不到正确结果:
1. 语法错误:未完成的输出语句
你的main方法最后一行是System.out.pr...,这明显是没写完的代码,Java编译器会直接报错。得补全成完整的输出语句,比如打印找到的三元组或者它们的乘积:
System.out.println("找到三元组:a=" + a + ", b=" + b + ", c=" + c); // 如果需要题目要求的乘积,也可以加一行: System.out.println("三元组乘积:" + a*b*c);
2. 循环范围过小,无法覆盖目标三元组
你把a、b、c的循环上限都设为200,但符合条件的三元组是(200, 375, 425)——其中b=375和c=425都远大于200,你的循环根本遍历不到这个范围,自然找不到结果。
根据a < b < c且a+b+c=1000的性质,可以推导合理的循环范围:
a的最大上限应该小于1000/3 ≈ 333(因为a是三个数里最小的,不能超过总和的三分之一)b要大于a,且小于(1000 - a)/2(因为b < c,所以b必须小于总和减a后的一半)c可以直接用1000 - a - b计算,不需要单独循环,还能减少一层循环提升效率
3. 循环初始值不合理
你从0开始循环,但毕达哥拉斯三元组是正整数(0参与的话会导致b=c,不符合b < c的条件),所以a、b应该从1开始。
修正后的完整代码
这里给你调整后的代码,解决了所有问题:
public class Problem9 { public static boolean isTriplet(int a, int b, int c) { // 确保a < b < c且满足勾股定理 return (a * a + b * b == c * c) && (a < b) && (b < c); } public static void main(String[] args) { int targetSum = 1000; // 遍历a的合理范围 for (int a = 1; a < targetSum / 3; a++) { // 遍历b的合理范围,b必须大于a且小于(targetSum - a)/2 for (int b = a + 1; b < (targetSum - a) / 2; b++) { int c = targetSum - a - b; if (isTriplet(a, b, c)) { System.out.println("找到毕达哥拉斯三元组:a=" + a + ", b=" + b + ", c=" + c); System.out.println("三元组乘积:" + (long)a * b * c); // 用long避免整数溢出 return; // 找到唯一解后直接退出 } } } System.out.println("未找到符合条件的三元组"); } }
这段代码会输出正确的三元组(200, 375, 425)以及它们的乘积31875000。
内容的提问来源于stack exchange,提问作者Anthony Jerez
相关产品推荐
相关产品推荐

