我正在解决与Collatz问题相关的任务。我创建了一个从任何起始编号生成1的方法:
public static void sequence(int value)
{
ArrayList<Integer> calc = new ArrayList<Integer>();
calc.add(value);
while(value != 1)
{
if(value % 2 == 0)
{
value = value / 2;
}
else if(value % 2 != 0)
{
value = (value * 3) + 1;
}
calc.add(value);
if(value == 1 )
{
System.out.println(calc);
}
}
}
public static void main(String[] args) {
for(int x = 1000000; x > 0; x--)
{
sequence(x);
}
}
}
我的任务的下一部分是找到一种方法,它会发现最长的Collatz序列低于1,000,000。
我提出了几个解决方案,例如下面的解决方案。当然,这些解决方案都没有奏效。
while(value != 1)
{
if(value % 2 == 0)
{
value = value / 2;
}
else if(value % 2 != 0)
{
value = (value * 3) + 1;
}
calc1.add(value);
if(calc1.size() > calc2.size())
{
calc2 = calc1;
}
}
System.out.println(calc2);
}
有没有人可以帮助并指导我找到使用2个或更多ArrayLists的比较找到最长的Collatz序列的正确方法。如果有比使用ArrayList更好的选项,我非常欢迎这些方法。 感谢。
答案 0 :(得分:0)
您需要维护一个maxList,它将使用最长的序列进行更新。
您可以在每次调用中将其传递给calc()
方法,也可以将其声明为类变量,以便在calc()
和main()
方法之上使用它。
// to update the max list
maxList = (list.size() > maxList.size()) ? list : maxList;
最后只打印结果
System.out.println(maxList.size());
System.out.println(maxList);
更新:您需要找出在calc()
方法中传递数字的有效方法
对于大输入,它会抛出java.lang.OutOfMemoryError
。