【问题标题】:Finding the Collatz sequence with the highest amount of terms查找项数最多的 Collat​​z 序列
【发布时间】:2016-11-12 19:18:09
【问题描述】:

我目前正在研究关于 Collat​​z 猜想的问题。 我将附上问题的图片。

Question (from ProjectEuler)

现在问题显然在 1 到 1,000,000 之间。但是我添加了一些功能,允许用户选择起点和终点的位置。虽然我遇到了问题。 (作为一个没有编程经验的一年级 CS 学生,目前我的知识非常有限。

我关于如何找到具有最高序列或最高'loopCount'的想法的想法是将具有相应循环计数的数字推入一个数组,并尝试在该数组中找到最大循环计数值。但就我而言,这将涉及二维数组。

正如我所说,我的编程技能有限(我们还没有涉及数组),所以我不知道如何开始。

这是我目前所拥有的:

    System.out.println("Enter starting point:");
    Scanner userStartingPoint = new Scanner(System.in);
    long startingPoint = userStartingPoint.nextInt();

    System.out.println("Enter ending point:");
    Scanner userEndingPoint = new Scanner(System.in);
    long endingPoint = userEndingPoint.nextInt();

    long timeBefore = System.currentTimeMillis();
    int loopCount;

    for(long i = startingPoint; i <= endingPoint; i++) {

        long number = i;
        loopCount = 1;

        while(number != 1) {
            if(number%2 == 0) {
                number = number/2;
            } else if(number%2 != 0) {
                number = (3*number)+1;
            }
            loopCount++;
        }

        System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
    }

    long timeAfter = System.currentTimeMillis();
    long timeTaken = timeAfter - timeBefore;
    System.out.println(endingPoint - startingPoint + " sequences.");
    System.out.println("Time taken: " + timeTaken/1000 + " seconds.");

我在这里使用“long”作为很多变量的数据类型,因为我发现有些数字的迭代次数超过了“int”数据类型可以处理的数量。

【问题讨论】:

    标签: java arrays collatz


    【解决方案1】:

    只需将最高的 loopCount 保存在一个额外的变量中,如果它增加,则在每次迭代后更新它。

    int maxCount = 0;
    int loopCount;
    
    for(long i = startingPoint; i <= endingPoint; i++) {
    
        long number = i;
        loopCount = 1;
    
        while(number != 1) {
            if(number%2 == 0) {
                number = number/2;
            } else if(number%2 != 0) {
                number = (3*number)+1;
            }
            loopCount++;
        }
        if(loopCount > maxCount){
            maxCount = loopCount;
        }
        System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
    }
    System.out.println("Highest loopCount : " + maxCount);
    

    【讨论】:

    • 好尴尬!这绝对是一种更简单的方法。谢谢
    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多