所以我的问题是关于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);
}
}
答案 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);
我没有抬头,这是什么规则对于它来说是合理的。 :)