我正在使用此代码来解决Project Euler的问题#9。奇迹般地,它能够为我生成正确的解决方案,但后来我意识到我的代码中存在一个巨大的问题,我不能只是在地毯下扫描并转向下一个问题。我删除了一些与解决问题相关的代码,并保留了生成毕达哥拉斯三元组的必要条件。在编写代码之前,我读了这篇关于如何制定数字的文章:生成毕达哥拉斯三元组的公式:
https://en.wikipedia.org/wiki/Pythagorean_triple#Generating_a_triple
这是我的代码:
public class Problem9 {
public static void main(String[] args) {
int a = 0;
int b = 0;
int c = 0;
for (int m = 1; m < 6; m++) {
for (int n = m + 1; n < 21; n++) {
a = (int) (Math.pow(n, 2) - Math.pow(m, 2));
b = 2 * n * m;
c = (int) (Math.pow(n, 2) + Math.pow(m, 2));
if ((Math.pow(a, 2) + Math.pow(b, 2)) == Math.pow(c, 2)) {
System.out.println(a + " " + b + " " + c);
// System.out.println(a*b*c);
}
}
}
} // end main
} // end class
代码开始通过打印3,4,5
做正确的事情但是,然后它打印8,6,10
我知道它是先前三元组的倍数,但我不明白为什么它打印出来错误的订单。它始终如一地达到我设定的极限。我该如何解决?我还要了解如何防止生成倍数的指针。
答案 0 :(得分:3)
这仅仅是因为a
,b
和c
的公式是什么;您的代码没有任何逻辑错误。如果您希望按顺序输出它们,只需在打印声明之前签入。
if (a > b)
System.out.println(a + " " + b + " " + c);
else
System.out.println(b + " " + a + " " + c);
答案 1 :(得分:0)
如果使用调试器完成程序,很明显它是如何生成输出的。第一个for循环从1开始并转到5,这意味着将有4次迭代。在迭代1中,第二个for循环从2开始并转到20.在迭代2中,第二个for循环从3开始并转到20.你能看到你的for循环如何在同一个空间中搜索两次吗?然后检查每个组合是否符合一般规则,“平方加b平方等于c平方”。这是一种“强力”方法,您可以在其中搜索条件的每个潜在数字。有什么关于这种情况,可以帮助你消除潜在的数字?现有数字中是否有某些模式可以帮助您搜索模式而不是测试条件?