项目Euler 14-Java StackOverflower错误
对于那些不熟悉这个问题的人来说,这是一个问题 我得到一个StackOverflower错误,代码如下:项目Euler 14-Java StackOverflower错误,java,stack-overflow,Java,Stack Overflow,对于那些不熟悉这个问题的人来说,这是一个问题 我得到一个StackOverflower错误,代码如下: public class LongestCollatzSequence { static int count = 1; public static void main(String[] args) { final int range = 1000000; int maxSeq = 0; List<Integer> chainList = new Arra
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);
}
}
public类LongestCollatzSequence{
静态整数计数=1;
公共静态void main(字符串[]args){
最终整数范围=1000000;
int maxSeq=0;
List chainList=新建ArrayList();
对于(int i=1;i Collections.max(chainList)){
clear();
链表。添加(计数);
maxSeq=i;
计数=1;
}
}
System.out.println(“序列起始号:+maxSeq”);
}
私有静态void generateSequence(int num){
如果(num==1){
返回;
}
如果(数值%2==0){
计数++;
生成序列(num/2);
}否则{
计数++;
生成顺序(num*3+1);
}
}
}
高水位流量:
-对于数字2-100000,为该数字生成collatz序列。
-链表是存储为每个数字生成的序列长度的列表,即数字13的序列大小为10(参见示例)。
-如果当前序列大小大于链列表中的最大值,请清除链列表并添加新的最大值,同时将i的值存储在maxReq中,以记住生成最长链的起始编号。有趣的问题,但java中的int限制为2^31-1。您可以使用long或BigInteger对该限制进行crox
private static void generateSequence(long num) {
if (num == 1) {
return;
}
if (num % 2 == 0) {
count++;
generateSequence(num / 2);
} else {
count++;
generateSequence(num * 3 + 1);
}
}
完整发布确切的异常(包括堆栈跟踪)。使用迭代而不是递归。你在哪一行接受这个错误哦,来吧,伙计们。我们不需要堆栈跟踪或错误的精确行。堆栈溢出是堆栈溢出。通过避免多次生成数字序列,可以大大提高性能。一旦获得序列长度,请将其缓存为一个数字。您可以使用
地图。然后在另一个序列中,如果你得到中间的数字,你已经计算了它的长度,你可以停在那里,然后使用它。顺便说一句,你不应该在这里使用递归。只需遵循迭代方法。您将从1000000开始的最大值。我怀疑任何一个都会打破整数溢出。我遇到的最高值约为4000000 IIRC。哦,我明白了。因此,可能是int
溢出在某个点使num
为负值,然后将进程发送到一个循环中+1.为了发现这一点。但即使使用此解决方案,num
也有可能变为负值,但没有进入一个周期。似乎唯一正确的做法是将num
设置为biginger
,而不是int
或long
。是的,biginger是最好的。我用了很长时间只是为了测试overflow@DavidWallace对于给定的范围,long
就足够了。我这样说是因为我已经解决了这个问题但即使程序终止,也无法证明溢出没有发生。你真的不知道long
是否足够,除非你在每一步都检查num
。