我正在编写一个应该创建数字链的程序,并且看到一个是最长的。问题是我的内存耗尽,我不知道是什么吃了所有的内存。有谁知道问题是什么?
public static void main(String[] args) {
ArrayList<Integer> longestchain;
ArrayList<Integer> chain = new ArrayList<Integer>();
int size = 0;
int longestsize = 0;
int start;
int number = 0;
for(int i = 3; i < 1000000; i++)
{
start = i;
chain.clear();
chain.add(start);
size = 1;
while(true)
{
if(start == 1)
{
break;
}
if(iseven(start))
{
start = start / 2;
}
else
{
start = start*3 + 1;
}
chain.add(start);
size++;
}
if(size > longestsize)
{
longestsize = size;
longestchain = chain;
number = i;
}
//System.out.println(i);
}
System.out.println(number + ". " + longestsize);
}
public static boolean iseven(int n)
{
return (n % 2 == 0);
}
答案 0 :(得分:4)
问题是当i=113383
遇到整数溢出时。这会导致无限循环不断添加到chain
,直到用完堆空间。将chain
和longestchain
更改为ArrayList<Long>
,将start
更改为long
,将iseven()
更改为long
,您将解决该问题特别的问题。
另一个问题是longestchain = chain
分配引用,而您需要复制内容。否则,下一次迭代将擦除longestchain
。
答案 1 :(得分:0)
这可能不是解决方案,而是提示:
ArrayList的默认数组大小为10.将ArrayLists初始化为更接近您期望值的值,或者在引擎盖下发生许多阵列创建:
// e.g.
ArrayList<Integer> chain = new ArrayList<Integer>(50000);
答案 2 :(得分:0)
不知道你为什么内存不足,但我注意到你的代码中有一个错误 - 最长链和链指向同一个对象,所以当你清除链时,你也清除了最长链。您可以通过创建一个包含链而不是赋值的内容的新数组来修复它。