在 Java 中搜索 Collatz 序列中的最长链,循环未终止
Searching longest chain in Collatz sequence in Java, loop not terminating
我想应用 Collatz 序列并将其应用于从 1 到 10^6 的所有数字,并且 return 最大链数需要达到 1。但是,我的问题是我的循环似乎不会在 Eclipse 中终止,我不明白为什么,尽管我希望每一步都完成,但我什至无法在控制台中显示我的所有打印件。
collatz 序列按以下规则计算:
如果n是奇数,下一个数是n/2
如果n是偶数,则下一个数是3n + 1
这是我目前所拥有的:
public static long collatz() {
long res = 0;
long n = 1;
long count = 0;
long largestCount = 0;
long t = 0;
for (long k = 1; k <= 20; k++) {
n = k;
while (n != 1) {
if ((n % 2) == 0) {
n = n / 2;
count = count + 1;
}
else {
n = (3 * n) + 1;
count = count + 1;
}
if (count > largestCount) {
largestCount = count;
res = k;
}
}
}
System.out.println(res);
return res;
}
您的代码应该 运行 正确。虽然它不是工作代码。
您正在检查条件以查看当前 count
是否大于当前 largest count
inside while 循环,这实际上没有意义,因为您需要获取 collatz 序列的长度,然后将其与当前最大值进行比较。除此之外,您的代码还不错。 :)
这是我写的东西,如果你有兴趣的话。
final int number = 1000000;
long sequenceLength = 0;
long startingNumber = 0;
long sequence;
for (int i = 2; i <= number; i++) {
int length = 1;
sequence = i;
while (sequence != 1) {
if ((sequence % 2) == 0) {
sequence = sequence / 2;
} else {
sequence = sequence * 3 + 1;
}
length++;
}
//Check if sequence is the best solution
if (length > sequenceLength) {
sequenceLength = length;
startingNumber = i;
}
}
System.out.println(startingNumber);
它运行但它总是打印最后测试的数字,因为你没有重置 count
。
我还将 count
值的增量从 if/else 语句中移出,因为增量不依赖于 n
.[=15= 的值]
而且我已将 largestCount
的更新移到 while 循环之后。
public static long collatz() {
long res = 0;
long n = 1;
long count = 0;
long largestCount = 0;
long t = 0;
for (long k = 1; k <= 20; k++) {
n = k;
count = 0; // start every sequence with count = 0
while (n != 1) {
if ((n % 2) == 0) {
n = n / 2;
}
else {
n = (3 * n) + 1;
}
count = count + 1;
}
if (count > largestCount) {
largestCount = count;
res = k;
}
}
System.out.println(res);
return res;
}
如果您阅读我的解决方案,您会发现为一堆代码行应该做的事情编写注释是如何非常有用的,并且可以使代码自我记录..
public static long collatz(int maxN)
{
long res = 0, n = 1, count = 0, largestCount = 0, t = 0;
// for K in [1, max-N]
for (long k = 1; k <= maxN; k++)
{
// reset count to zero
n = k; count = 0;
// count how many steps to get to 1
while (n != 1)
{
// n = collatz(n)
n = (n%2==0 ? n/2 : (3*n)+1);
count++; // count the step
}
// check for maximum count
if (count > largestCount)
{
largestCount = count;
res = k;
}
}
return res; // return maximum solution
}
在 C# 或 Visual basic
中使用 Biginteger 而不是 Long
我想应用 Collatz 序列并将其应用于从 1 到 10^6 的所有数字,并且 return 最大链数需要达到 1。但是,我的问题是我的循环似乎不会在 Eclipse 中终止,我不明白为什么,尽管我希望每一步都完成,但我什至无法在控制台中显示我的所有打印件。
collatz 序列按以下规则计算:
如果n是奇数,下一个数是n/2
如果n是偶数,则下一个数是3n + 1
这是我目前所拥有的:
public static long collatz() {
long res = 0;
long n = 1;
long count = 0;
long largestCount = 0;
long t = 0;
for (long k = 1; k <= 20; k++) {
n = k;
while (n != 1) {
if ((n % 2) == 0) {
n = n / 2;
count = count + 1;
}
else {
n = (3 * n) + 1;
count = count + 1;
}
if (count > largestCount) {
largestCount = count;
res = k;
}
}
}
System.out.println(res);
return res;
}
您的代码应该 运行 正确。虽然它不是工作代码。
您正在检查条件以查看当前 count
是否大于当前 largest count
inside while 循环,这实际上没有意义,因为您需要获取 collatz 序列的长度,然后将其与当前最大值进行比较。除此之外,您的代码还不错。 :)
这是我写的东西,如果你有兴趣的话。
final int number = 1000000;
long sequenceLength = 0;
long startingNumber = 0;
long sequence;
for (int i = 2; i <= number; i++) {
int length = 1;
sequence = i;
while (sequence != 1) {
if ((sequence % 2) == 0) {
sequence = sequence / 2;
} else {
sequence = sequence * 3 + 1;
}
length++;
}
//Check if sequence is the best solution
if (length > sequenceLength) {
sequenceLength = length;
startingNumber = i;
}
}
System.out.println(startingNumber);
它运行但它总是打印最后测试的数字,因为你没有重置 count
。
我还将 count
值的增量从 if/else 语句中移出,因为增量不依赖于 n
.[=15= 的值]
而且我已将 largestCount
的更新移到 while 循环之后。
public static long collatz() {
long res = 0;
long n = 1;
long count = 0;
long largestCount = 0;
long t = 0;
for (long k = 1; k <= 20; k++) {
n = k;
count = 0; // start every sequence with count = 0
while (n != 1) {
if ((n % 2) == 0) {
n = n / 2;
}
else {
n = (3 * n) + 1;
}
count = count + 1;
}
if (count > largestCount) {
largestCount = count;
res = k;
}
}
System.out.println(res);
return res;
}
如果您阅读我的解决方案,您会发现为一堆代码行应该做的事情编写注释是如何非常有用的,并且可以使代码自我记录..
public static long collatz(int maxN)
{
long res = 0, n = 1, count = 0, largestCount = 0, t = 0;
// for K in [1, max-N]
for (long k = 1; k <= maxN; k++)
{
// reset count to zero
n = k; count = 0;
// count how many steps to get to 1
while (n != 1)
{
// n = collatz(n)
n = (n%2==0 ? n/2 : (3*n)+1);
count++; // count the step
}
// check for maximum count
if (count > largestCount)
{
largestCount = count;
res = k;
}
}
return res; // return maximum solution
}
在 C# 或 Visual basic
中使用 Biginteger 而不是 Long