查找项数最多的 Collatz 序列
Finding the Collatz sequence with the highest amount of terms
我目前正在研究一个关于 Collatz 猜想的问题。
我将附上问题的图片。
Question (from ProjectEuler)
现在问题显然是在 1 到 1,000,000 之间。但是我添加了一些功能,允许用户选择起点和终点的位置。尽管我 运行 遇到了问题。 (作为没有编程经验的一年级 CS 学生,我目前的知识非常有限)。
我关于如何找到最高序列或最高 'loopCount' 的想法是将数字及其对应的循环计数压入一个数组,并尝试在该数组中找到最大循环计数值大批。但就我而言,这将涉及一个二维数组。
正如我所说,我的编程技能有限(我们还没有涉及数组),所以我不知道如何开始。
这是我目前的情况:
System.out.println("Enter starting point:");
Scanner userStartingPoint = new Scanner(System.in);
long startingPoint = userStartingPoint.nextInt();
System.out.println("Enter ending point:");
Scanner userEndingPoint = new Scanner(System.in);
long endingPoint = userEndingPoint.nextInt();
long timeBefore = System.currentTimeMillis();
int loopCount;
for(long i = startingPoint; i <= endingPoint; i++) {
long number = i;
loopCount = 1;
while(number != 1) {
if(number%2 == 0) {
number = number/2;
} else if(number%2 != 0) {
number = (3*number)+1;
}
loopCount++;
}
System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
}
long timeAfter = System.currentTimeMillis();
long timeTaken = timeAfter - timeBefore;
System.out.println(endingPoint - startingPoint + " sequences.");
System.out.println("Time taken: " + timeTaken/1000 + " seconds.");
我在这里使用 'long' 作为很多变量的数据类型,因为我发现一些数字的迭代次数超过了 'int' 数据类型可以处理的数量。
只需将最高的循环计数保存在一个额外的变量中,如果它增加,则在每次迭代后更新它。
int maxCount = 0;
int loopCount;
for(long i = startingPoint; i <= endingPoint; i++) {
long number = i;
loopCount = 1;
while(number != 1) {
if(number%2 == 0) {
number = number/2;
} else if(number%2 != 0) {
number = (3*number)+1;
}
loopCount++;
}
if(loopCount > maxCount){
maxCount = loopCount;
}
System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
}
System.out.println("Highest loopCount : " + maxCount);
我目前正在研究一个关于 Collatz 猜想的问题。 我将附上问题的图片。
Question (from ProjectEuler)
现在问题显然是在 1 到 1,000,000 之间。但是我添加了一些功能,允许用户选择起点和终点的位置。尽管我 运行 遇到了问题。 (作为没有编程经验的一年级 CS 学生,我目前的知识非常有限)。
我关于如何找到最高序列或最高 'loopCount' 的想法是将数字及其对应的循环计数压入一个数组,并尝试在该数组中找到最大循环计数值大批。但就我而言,这将涉及一个二维数组。
正如我所说,我的编程技能有限(我们还没有涉及数组),所以我不知道如何开始。
这是我目前的情况:
System.out.println("Enter starting point:");
Scanner userStartingPoint = new Scanner(System.in);
long startingPoint = userStartingPoint.nextInt();
System.out.println("Enter ending point:");
Scanner userEndingPoint = new Scanner(System.in);
long endingPoint = userEndingPoint.nextInt();
long timeBefore = System.currentTimeMillis();
int loopCount;
for(long i = startingPoint; i <= endingPoint; i++) {
long number = i;
loopCount = 1;
while(number != 1) {
if(number%2 == 0) {
number = number/2;
} else if(number%2 != 0) {
number = (3*number)+1;
}
loopCount++;
}
System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
}
long timeAfter = System.currentTimeMillis();
long timeTaken = timeAfter - timeBefore;
System.out.println(endingPoint - startingPoint + " sequences.");
System.out.println("Time taken: " + timeTaken/1000 + " seconds.");
我在这里使用 'long' 作为很多变量的数据类型,因为我发现一些数字的迭代次数超过了 'int' 数据类型可以处理的数量。
只需将最高的循环计数保存在一个额外的变量中,如果它增加,则在每次迭代后更新它。
int maxCount = 0;
int loopCount;
for(long i = startingPoint; i <= endingPoint; i++) {
long number = i;
loopCount = 1;
while(number != 1) {
if(number%2 == 0) {
number = number/2;
} else if(number%2 != 0) {
number = (3*number)+1;
}
loopCount++;
}
if(loopCount > maxCount){
maxCount = loopCount;
}
System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + ".");
}
System.out.println("Highest loopCount : " + maxCount);