我想应用Collatz序列并将其应用于1到10 ^ 6之间的所有数字,并返回所需数量最大的数字达到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;
}
答案 0 :(得分:0)
您的代码应该正常运行。虽然这不是有效的代码。
您正在检查条件,以查看当前count
是否大于当前largest count
内部 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);
答案 1 :(得分:0)
它会运行,但它会始终打印最后一个测试的号码,因为您没有重置count
。
我还将count
值的增量移出if / else语句,因为递增不依赖于n
的值。
我在while循环之后移动了largestCount
的更新。
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;
}
答案 2 :(得分:0)
如果您阅读了我的解决方案,您可以看到如何编写一堆代码行应该做的注释是非常有用的,并使代码自我记录。
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
}
答案 3 :(得分:0)
在C#或Visual Basic中使用 Biginteger 而不是 Long