Ненормально работающий цикл Java, - PullRequest
0 голосов
/ 01 июля 2011

Это грубая попытка решить проблему, но она не дает правильного ответа.Программа работает, но не выдает желаемого результата.Я считаю, что логика и программа верны.

Это проблема известного сайта (не хочу спойлера)

Он запрашивает число, которое производитсамая длинная сеть Collatz до миллиона.

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 ]

3 голосов
/ 01 июля 2011

Ну, я чувствую, что было бы обманом дать вам код для правильного ответа, как один из поклонников Project Euler.Вы выводите длину самой длинной цепочки, а не число, которое ее получает.Если вы действительно хотите, я могу показать вам одну строку, которую нужно изменить, но, честно говоря, это простое решение, и я призываю вас сделать это самостоятельно.

1 голос
/ 01 июля 2011

Если предполагается, что программа вычисляет количество шагов в гипотезе Коллатца , реализация выглядит хорошо для меня.

Последовательность чисел, описанная в 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.

Ошибка должна быть где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...