在学习Java的同时,我重做了一些Project Euler问题。 这是关于问题14 - 最长的Collatz序列:https://projecteuler.net/problem=14
我的程序运行正好适用于较低的CEILING
,例如1000,但是当执行时就像发布它无限循环,我想?这里出了什么问题?
public class Test {
public static void main(String[] args) {
int tempMax = 0;
final int CEILING = 1_000_000;
for (int j = 1; j < CEILING; ++j) {
tempMax = Math.max(tempMax, collatzLength(j));
}
System.out.println(tempMax);
}
static int collatzLength(int n) { //computes length of collatz-sequence starting with n
int temp = n;
for (int length = 1; ; ++length) {
if (temp == 1)
return length;
else if (temp % 2 == 0)
temp /= 2;
else
temp = temp * 3 + 1;
}
}
}
调用System.out.println(collatzLength(1000000));
分别正常工作,所以我认为我们可以在此处排除错误。
答案 0 :(得分:5)
您应该使用svg[i].selectAll(".dot")
.data(thedata)
.enter()
.append("circle")
.attr("class", "dot")
.attr("r", 4.5)
.attr("cx", xMap)
.attr("cy", yMap)
.style("fill", "steelblue");
// Try to add arbitrary line
svg[i].append("line")
.attr("x1", 0)
.attr("x2", 3)
.attr("y1", 0)
.attr("y2", 4);
代替long
。在int
进行计算时int
溢出,导致无限循环。从问题描述:
注意:一旦链条启动,条款允许超过一百万。
导致问题的数字:113383
collatzLength
版本给出的结果仍然不正确,因为您打印的是最长链的长度,但是您需要生成最长链的数字。
long