Collat​​z猜想:计算有多少长度为111

时间:2018-02-04 15:47:59

标签: java collatz

所以我的问题是关于collat​​z猜想。任务是我必须编写一个代码来计算每个猜想的步长。例如,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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的代码在主方法中写入所有内容的坏习惯。

你至少应该写一个(纯)函数,它给你一些参数的序列长度。然后,一个简单的for循环足以找出符合您标准的函数值。

但是既然你喜欢一次性写一切,你就会立即引入一个严重的错误。想一想变量$client = new \GuzzleHttp\Client(); $api_link = 'https://xx.example.com:xxxx/bulksms/bulksms'; $result = $client->get($api_link, [ 'query' => [ 'username' => 'xxx', 'password' => 'xxx', 'type' => 0, 'dlr' => 1, 'destination' => 'xxx', 'source' => 'xxx', 'message' => 'xxx' ] ]); 给你的是什么?它的目的是什么?它是否实现了这一目的,还是应该阅读laenge

答案 2 :(得分:0)

以下是已解决的问题,如我的评论所述:

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。
  • 我们在到达anzahl时打破了内部的for-loop。
  • 内部循环中的
  • i ++是错误的。
  • 这是j需要保持在1以上才能继续,而不是我

我没有抬头,这是什么规则对于它来说是合理的。 :)