对于那些不熟悉该问题的人,here是的。
我收到一个带有以下代码的 StackOverflowError:
public class LongestCollatzSequence {
static int count = 1;
public static void main(String[] args) {
final int range = 1000000;
int maxSeq = 0;
List<Integer> chainList = new ArrayList<Integer>();
for(int i = 1; i <= range; i++) {
generateSequence(i);
if(chainList.isEmpty()) {
chainList.add(count);
count = 1;
} else if(!chainList.contains(count) && count > Collections.max(chainList)) {
chainList.clear();
chainList.add(count);
maxSeq = i;
count = 1;
}
}
System.out.println("Sequence starting number: "+maxSeq);
}
private static void generateSequence(int num) {
if(num == 1) {
return;
}
if(num % 2 == 0) {
count++;
generateSequence(num/2);
} else {
count++;
generateSequence(num*3+1);
}
}
}
高级流程:
-对于数字 2 - 100000,生成该数字的 collatz 序列。 -链列表是存储为每个数字生成的序列长度的列表,即数字 13 的序列大小为 10(参见示例)。 -如果当前序列大小大于链表中的最大值,则清除链表并添加新的最大值,并将i的值存储在maxReq中以记住产生最长链的起始编号。
最佳答案
有趣的问题,但是java中的int被限制为2^31-1,你可以使用long或BigInteger来打破这个限制
private static void generateSequence(long num) {
if (num == 1) {
return;
}
if (num % 2 == 0) {
count++;
generateSequence(num / 2);
} else {
count++;
generateSequence(num * 3 + 1);
}
}
关于java - 项目 Euler 14 - Java StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066549/