我的代码生成毕达哥拉斯三胞胎有什么问题?

时间:2015-11-17 03:42:24

标签: java math

我正在使用此代码来解决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我知道它是先前三元组的倍数,但我不明白为什么它打印出来错误的订单。它始终如一地达到我设定的极限。我该如何解决?我还要了解如何防止生成倍数的指针。

2 个答案:

答案 0 :(得分:3)

这仅仅是因为abc的公式是什么;您的代码没有任何逻辑错误。如果您希望按顺序输出它们,只需在打印声明之前签入。

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平方”。这是一种“强力”方法,您可以在其中搜索条件的每个潜在数字。有什么关于这种情况,可以帮助你消除潜在的数字?现有数字中是否有某些模式可以帮助您搜索模式而不是测试条件?