首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >某个输入参数之上的突然无限循环?

某个输入参数之上的突然无限循环?
EN

Stack Overflow用户
提问于 2015-09-28 14:28:42
回答 1查看 75关注 0票数 2

在学习Java时,我正在重新处理一些Project问题。这是关于问题14最长的Collatz序列:https://projecteuler.net/problem=14

我的程序在像1000这样的较低的CEILING上运行得很好,但是当像posted那样执行时,我想是无限循环的吗?这里出了什么问题?

代码语言:javascript
复制
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));工作得很好,所以我认为我们可以在这里排除错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-28 14:32:51

您应该使用long而不是intint在用collatzLength进行计算时溢出,这将导致无限循环。从问题描述:

注:一旦链开始,条款允许超过100万。

引起问题的数字: 113383

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

代码语言:javascript
复制
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(long n)
{
    long temp = n;

    for (int length = 1;; ++length)
    {
        if (temp == 1)
            return length;
        else if (temp % 2 == 0)
            temp /= 2;
        else
            temp = temp * 3 + 1;
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32825533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档