突然无限循环高于某些输入参数?

时间:2015-09-28 14:28:43

标签: java infinite-loop integer-overflow

在学习Java的同时,我重做了一些Project Euler问题。 这是关于问题14 - 最长的Collat​​z序列:https://projecteuler.net/problem=14

我的程序运行正好适用于较低的CEILING,例如1000,但是当执行时就像发布它无限循环,我想?这里出了什么问题?

public class Test {
    public static void main(String[] args) {
        int tempMax = 0;
        final int CEILING = 1_000_000;

        for (int j = 1; j < CEILING; ++j) {
            tempMax = Math.max(tempMax, collatzLength(j));
        }
        System.out.println(tempMax);
    }

    static int collatzLength(int n) { //computes length of collatz-sequence starting with n
            int temp = n;

            for (int length = 1; ; ++length) {
                if (temp == 1) 
                    return length;
                else if (temp % 2 == 0)
                    temp /= 2;
                else
                    temp = temp * 3 + 1;
            }
    }
}

调用System.out.println(collatzLength(1000000));分别正常工作,所以我认为我们可以在此处排除错误。

1 个答案:

答案 0 :(得分:5)

您应该使用svg[i].selectAll(".dot") .data(thedata) .enter() .append("circle") .attr("class", "dot") .attr("r", 4.5) .attr("cx", xMap) .attr("cy", yMap) .style("fill", "steelblue"); // Try to add arbitrary line svg[i].append("line") .attr("x1", 0) .attr("x2", 3) .attr("y1", 0) .attr("y2", 4); 代替long。在int进行计算时int溢出,导致无限循环。从问题描述:

  

注意:一旦链条启动,条款允许超过一百万。

导致问题的数字:113383

collatzLength版本给出的结果仍然不正确,因为您打印的是最长链的长度,但是您需要生成最长链的数字。

long