Java中的Collatz/冰雹序列-意外行为
我有下面的代码,我很快就把它们放在一起,找到了最大的数字,介于1和99999之间。该程序在35655小时内运行良好,产生了324次冰雹计数。熟悉该挑战的任何人都会知道,最大序列由77031生成(给出354)。您可以从我的Java中的Collatz/冰雹序列-意外行为,java,Java,我有下面的代码,我很快就把它们放在一起,找到了最大的数字,介于1和99999之间。该程序在35655小时内运行良好,产生了324次冰雹计数。熟悉该挑战的任何人都会知道,最大序列由77031生成(给出354)。您可以从我的println()语句的输出中看到,由于某种原因,if语句一旦超过33655,就会停止计算。另一个println()语句验证我的generateSequence()方法是否正常工作。你知道这里出了什么问题吗 代码如下 import java.util.ArrayList; p
println()
语句的输出中看到,由于某种原因,if语句一旦超过33655,就会停止计算。另一个println()
语句验证我的generateSequence()
方法是否正常工作。你知道这里出了什么问题吗
代码如下
import java.util.ArrayList;
public class Hailstone {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Hailstone hs = new Hailstone();
}
public Hailstone () {
System.out.println("Size of sequence for 35655 is: " + generateSequence(35655).size());
System.out.println("Size of sequence for 77031 is: " + generateSequence(77031).size());
calcLargestSeqLength(100000);
}
/**
*
* finds the number with the largest hailstone sequence between 1 and aNum
*/
private void calcLargestSeqLength(int aNum) {
int largest = 0;
for (int i = 1; i < aNum; i++)
{
int size = generateSequence(i).size();
if(size > largest)
{
System.out.println("if statement evaluated to true for: " + i + " / " + size);
largest = i;
}
}
System.out.println("Number with the largest sequence is: " + largest);
}
private ArrayList<Integer> generateSequence(int aNum) {
ArrayList<Integer> hSeq = new ArrayList();
int x = aNum;
hSeq.add(x);
if (x != 1)
{
while (x != 1)
{
if ((x % 2) == 0)
{
x = x/2;
hSeq.add(x);
}
else
{
x = (3 * x) + 1;
hSeq.add(x);
}
}
}
return hSeq;
}
您正在使用最大
表示最大大小,也表示生成最大大小的值
您需要两个变量:maximust
和startingvalueformaximust
largest = i;
应该是
largest = size;
startingValueForLargest = i;
目前的情况是,最大的
被设置为35655,因此354没有超过它。第1点:你确定它不仅仅需要非常非常长的时间才能运行吗?数字2:您确定它没有溢出吗?根据ajb的建议,您是否尝试使用long
而不是int
?它以秒为单位运行ajb,如输出所示,正在计算该数字。至于溢出,我没有收到netbeans抛出的任何异常。程序成功终止。我之前在for循环中添加了一个Println,以确保它在99999之前执行,所以这不是问题所在。肯定与if声明有关…完全同意Dici。实际上,地球上没有人理解科拉兹问题,所以你不能假设int
足够大。这确实应该用biginger
来完成,或者检查溢出。@Dici一旦我完成了generateSequence()方法,我就完全忘记了正在进行的实际计算!我明白你的意思,你知道不知道计算中的数字会有多大,可能会导致它溢出。谢谢。谢谢Paul,这个程序现在可以运行了,但是你能解释一下为什么它在35665年之前运行良好,而不是在35665年之后吗?因为这就是初始输入的大小开始超过它们生成的记录长度的点。@Dave0504实际上,你没有理由说“它运行良好”。该逻辑应该计算最大的大小,并告诉您生成最长序列的数字。它显示了错误的答案。这一部分的逻辑没有“起作用”。
largest = size;
startingValueForLargest = i;