我找不到此代码中的错误。如果不是因为欧拉计划将我的答案裁定为不正确,我会向天堂发誓我的代码是正确的。
我可以使用另一种方法,但这个问题并不是那么复杂,但是我一直在试图找到这个错误。
问题是:
为正整数集定义了以下迭代序列:
n→n / 2(n是偶数) n→3n + 1(n为奇数)
使用上面的规则并从13开始,我们生成以下序列:
13→40→20→10→5→16→8→4→2→1 可以看出,该序列(从13开始并在1结束)包含10个项。虽然尚未证实(Collatz问题),但据认为所有起始数字都以1结束。
哪个起始编号低于一百万,产生最长的链?
我的代码是:
public class CollatzSequence014 {
public static void main(String [] args){
long start = System.currentTimeMillis();
long maxTotal = 0;
long inputNum = 0;
for (long i = 3; i < 1000000 ; i++){
long total = generateSequence(i);
if (total > maxTotal){
inputNum = i;
maxTotal = total;
}
}
long end = System.currentTimeMillis();
System.out.println("The input number was : " + inputNum + " and the total was " + maxTotal);
System.out.println("Time taken : " + (end - start) + "ms");
}
public static long generateSequence(long n){
long counter = 0;
long currentDigit = n;
while (currentDigit > 1){
counter++;
if (n % 2 == 0){
currentDigit = currentDigit / 2;
}
else {
currentDigit = (3 * currentDigit) + 1;
}
}
return counter;
}
}
答案 0 :(得分:3)
您必须检查currentDigit
是否为偶数,而不是n
。
if(currentDigit % 2 == 0)
答案 1 :(得分:0)
首先,您应该如何查找错误:尝试输出小n
的序列(而不仅仅是长度)(例如13
,因为问题已经为您提供了正确的序列)。你会看到你得到13
,40
,121
......这应该已经告诉你错误的位置。
答案 2 :(得分:0)
错误在这里:
if (n % 2 == 0){
应该是:
if (currentDigit % 2 == 0){