一个异常工作的java循环,

时间:2011-07-01 15:42:36

标签: java loops

这是一个蛮力尝试解决问题,但它没有给出正确的答案。该程序运行,但它没有产生所需的输出。我相信逻辑和程序是正确的。

这是problem of a famous site(不想破坏者)

它要求产生最长的Collat​​z链的数量低于一百万。

class Euler
{

public static void main (String args[])
{
    long len,longLength=0;
    for(long i =3;i<=1000000;i++)
    {
        len = Euler14.numFucs(i);
        System.out.println("Ans"+len+"\t"+i);
        if(len>longLength)
            longLength=len;
    }
    System.out.println(longLength);
}


public static long numFucs(long num)
{
    long count=1,$test=0;
    while(num>1)
    {
        if(num%2==0)
        {
            num=num/2;

        }
        else
        {
            num=3*num+1;

        }
        count++;


    }
    //System.out.println("\tEnd");
    return count;
    }
}

2 个答案:

答案 0 :(得分:3)

嗯,作为项目欧拉的粉丝,我觉得给你正确答案的代码是很划算的。您输出的是最长链的长度,而不是获得它的数量。如果你真的想要,我可以向你展示需要改变的一行,但老实说,这是一个简单的解决方案,我挑战你自己做。

答案 1 :(得分:1)

如果程序假设计算Collatz Conjecture中的步数,那么实现对我来说就好了。

OEIS Sequence A008908描述的数字序列。

这是你的程序和一些调试输出。

class Test {

    public static void main(String args[]) {
        long len, longLength = 0;
        System.out.println(Test.numFucs(13));
        String[] correct = ("1, 1, 2, 8, 3, 6, 9, 17, 4, 20, 7, 15, 10, 10, 18,"
                         + " 18, 5, 13, 21, 21, 8, 8, 16, 16, 11, 24, 11, 112, "
                         + "19, 19, 19, 107, 6, 27, 14, 14, 22, 22, 22, 35, 9, "
                         + "110, 9, 30, 17, 17, 17, 105, 12, 25, 25, 25, 12, "
                         + "12, 113, 113, 20, 33, 20, 33, 20, 20, 108, 108, 7,"
                         + " 28, 28, 28, 15, 15, 15, 103").split(", ");

        for (int i = 0; i <= 70; i++) {
            len = Test.numFucs(i);
            System.out.printf("i = %2d, Correct %3s, Computed: %3d%n", i,
                    correct[i], len);
            if (len > longLength)
                longLength = len;
        }

        System.out.println(longLength);
    }

    public static long numFucs(long num) {
        long count = 1;
        while (num > 1) {
            if (num % 2 == 0) {
                num = num / 2;

            } else {
                num = 3 * num + 1;

            }
            count++;
        }

        // System.out.println(count);
        return count;
    }
}

<强>输出:

i =  0, Correct   1, Computed:   1
i =  1, Correct   1, Computed:   1
i =  2, Correct   2, Computed:   2
i =  3, Correct   8, Computed:   8
i =  4, Correct   3, Computed:   3
i =  5, Correct   6, Computed:   6
i =  6, Correct   9, Computed:   9
i =  7, Correct  17, Computed:  17
i =  8, Correct   4, Computed:   4
i =  9, Correct  20, Computed:  20
i = 10, Correct   7, Computed:   7
i = 11, Correct  15, Computed:  15
i = 12, Correct  10, Computed:  10
i = 13, Correct  10, Computed:  10
i = 14, Correct  18, Computed:  18
i = 15, Correct  18, Computed:  18
i = 16, Correct   5, Computed:   5
...

正如您所看到的,它遵循OEIS序列。

错误必须是其他地方。