有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Collatz猜想:计算有多少个长度为111

所以我的问题是关于collatz猜想。任务是我必须写一个代码来计算每个猜想的步长。例如2 = 2/2 = 1是一个步骤

现在我需要知道1到10000之间有多少起始数字有111+步。我的密码是54,但我没有任何消息来源,不管是对是错

anzahl应该是有111个步骤的数字的计数器,laenge是每个数字的长度:

public class Collertz {

    public static void main(String[] args) {
        int max = 111;
        int anzahl = 0;
        int laenge = 0;

        for(int i=0; i<=10000;i++) {
            for (int j = i; i>1; i++) {
                if (j%2 == 0) {
                    j = j/2;
                    laenge++;
                }
                else {
                    j = 3*j+1;
                    laenge++;
                }
            }
            if (laenge >= max) {
                anzahl++;
            }
        }
        System.out.println(anzahl);
    }
}

共 (3) 个答案

  1. # 1 楼答案

    您的代码有一个坏习惯,就是使用main方法编写所有内容

    您至少应该编写一个(纯)函数,为某些参数提供序列长度。然后,一个简单的for循环就足以找出有多少函数值符合您的条件

    但是,由于您更喜欢一次性编写所有内容,因此您很快就引入了一个严重错误。想想变量laenge给了你什么?它的目的是什么?它是否达到了这一目的,还是应该改为sumOfLengths

  2. # 2 楼答案

    以下是我在评论中提到的已解决的问题:

    static int collatz (int max) {
        int anzahl = 0;
        for(int i=1; i<=10000; ++i) {
            for (int j = i, laenge=0; j>1; laenge++) {
                if (j % 2 == 0) 
                    j /= 2;
                else 
                    j = 3*j+1;
                if (laenge == max) {
                    anzahl++;
                    break;
                }
            }
        }
        System.out.println(anzahl);
        return anzahl;
    }
    collatz (111);
    
    • laenge++在if语句的每个分支中执行
    • laenge会为每个新号码重置
    • 到达安扎尔时,我们打破了内部for循环
    • 内部循环中的i++是错误的
    • 需要保持在1以上才能继续的是j,不是i

    我没有抬头看,衣领状况的规则是什么,听起来很合理。:)

  3. # 3 楼答案

    我发现你的代码有两个问题,一个主要问题和一个次要问题。主要问题是在第二个循环的for语句中测试并递增i。你不应该测试j并且不增加任何东西吗?我自己也会使用while循环。小问题是第一个循环以0而不是1开始。但这不应该影响你的结果