算法无法找到超过500除数的三角数

时间:2015-03-10 16:05:00

标签: java algorithm

我一直在解决Project Euler网站(problem 12)中的一个问题,但我无法弄清楚为什么我的代码无效。代码的目标是它应该找到具有超过500个除数的最小三角数。

private static long triangleNumber() {

    long currentTriangleNumber = 0;
    long triangleNumber = 0;
    int counter = 0;

    while (triangleNumber == 0) {
        counter++;
        currentTriangleNumber += counter;
        int divisorCounter = 0;
        for (int i = 1; i <= counter; i++) {
            if ((currentTriangleNumber % i) == 0) {
                divisorCounter++;
                if (divisorCounter >= 500) {
                    triangleNumber = currentTriangleNumber;
                }
            }
        }
    }

    return triangleNumber;
}

代码返回842161320,这不是正确的答案。据我所知,问题不在于语法,代码不会输出任何类型的错误消息。答案,从我简要查看的应该是76576500。

可以解释为什么代码没有找到解决方案吗?

1 个答案:

答案 0 :(得分:0)

以下是用于查找除数的数量的for循环:

    for (int i = 1; i <= counter; i++) {

您测试这些i中的每一个以查看它是否为除数,如果有500,则停止。

哪个好,但为什么要停在counter?查看问题描述中给出的列表:

#1 1: 1
#2 3: 1,3
#3 6: 1,2,3,6
#4 10: 1,2,5,10
#5 15: 1,3,5,15
#6 21: 1,3,7,21
#7 28: 1,2,4,7,14,28

取数字21.这是三角形数字6.因此,在你的程序中,它的计数器将是6

它有4个除数。但是只有两个小于或等于6.所以你的程序会说它只有两个除数,这显然是错的。

你必须计算所有除数,包括数字本身。对于真实答案(76576500),counter将为12375。你只计算小于12375的除数,而且它的数量少于500.

你的程序实际上告诉我们第一个三角形是什么,它的指数小于500的除数。