Java中的Collatz/冰雹序列-意外行为

Java中的Collatz/冰雹序列-意外行为,java,Java,我有下面的代码,我很快就把它们放在一起,找到了最大的数字,介于1和99999之间。该程序在35655小时内运行良好,产生了324次冰雹计数。熟悉该挑战的任何人都会知道,最大序列由77031生成(给出354)。您可以从我的println()语句的输出中看到,由于某种原因,if语句一旦超过33655,就会停止计算。另一个println()语句验证我的generateSequence()方法是否正常工作。你知道这里出了什么问题吗 代码如下 import java.util.ArrayList; p

我有下面的代码,我很快就把它们放在一起,找到了最大的数字,介于1和99999之间。该程序在35655小时内运行良好,产生了324次冰雹计数。熟悉该挑战的任何人都会知道,最大序列由77031生成(给出354)。您可以从我的
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;