我一直在解决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。
可以解释为什么代码没有找到解决方案吗?
答案 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的除数。