14 - 项目Euler - Java - 错误答案 - 错误?

时间:2016-09-19 08:25:46

标签: java collatz

我找不到此代码中的错误。如果不是因为欧拉计划将我的答案裁定为不正确,我会向天堂发誓我的代码是正确的。

我可以使用另一种方法,但这个问题并不是那么复杂,但是我一直在试图找到这个错误。

问题是:

为正整数集定义了以下迭代序列:

n→n / 2(n是偶数) n→3n + 1(n为奇数)

使用上面的规则并从13开始,我们生成以下序列:

13→40→20→10→5→16→8→4→2→1 可以看出,该序列(从13开始并在1结束)包含10个项。虽然尚未证实(Collat​​z问题),但据认为所有起始数字都以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;
}

}

3 个答案:

答案 0 :(得分:3)

您必须检查currentDigit是否为偶数,而不是n

if(currentDigit % 2 == 0)

答案 1 :(得分:0)

首先,您应该如何查找错误:尝试输出小n的序列(而不仅仅是长度)(例如13,因为问题已经为您提供了正确的序列)。你会看到你得到1340121 ......这应该已经告诉你错误的位置。

答案 2 :(得分:0)

错误在这里:

if (n % 2 == 0){

应该是:

if (currentDigit % 2 == 0){