My for l oop, похоже, не увеличивается. Он застревает на 2 (проект Эйлера 14) - PullRequest
0 голосов
/ 07 мая 2020

Я работаю над проектом euler # 14:

Вопрос:

Для набора положительных целых чисел определена следующая итерационная последовательность:

n → n / 2 (n четно) n → 3n + 1 (n нечетно)

Используя приведенное выше правило и начиная с 13, мы генерируем следующую последовательность:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1. Как видно, эта последовательность (начиная с 13 и заканчивая 1) содержит 10 членов. Хотя это еще не доказано (проблема Коллатца), считается, что все начальные числа заканчиваются sh на 1.

Какое начальное число, меньше одного миллиона, дает самую длинную цепочку?

ПРИМЕЧАНИЕ: После начала цепочки разрешено использовать термины go выше одного миллиона.

Проблема:

Когда я запускаю этот код, первый для l oop работает как положено. Но тогда переменная num, похоже, не увеличивается для l oop и остается на 2 (чего нет даже в параметрах num, которые я дал для начала), давая результат:

2
0

1
1

повторяется снова и снова. Не знаю, почему это происходит, и ничего не могу найти в Интернете.

Код:

#include <stdio.h>

int main() {
    int maxcount = 0;
    for (int num = 5; num < 2000000; num++) {
        printf("%d\n0\n\n", num);
        int count = 0;
        while (num >= 1) {
            count++;
            if (num == 2) {
                num = 1;
                printf("1\n%d\n\n", count);
            }
            if (num > 1) {
                if (num % 2 == 0) {
                    num = num / 2;
                    printf("%d\n%d\n\n", num, count);
                }
                else {
                    num = (3 * num) + 1;
                    printf("%d\n%d\n\n", num, count);
                }
            }
            if (num == 1) {
                break;
            }
        }
        if (count > maxcount) {
            maxcount = count;
        }
    }
    printf("%d", maxcount);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

В while l oop вы изменяете значение переменной l oop (num).

Вы начинаете с num = 5, а внутреннее while l oop затем следует правилам Коллатца и достигает 1, после чего while-l oop заканчивается.

Затем for-l oop заканчивается, а num увеличивается до 2 на num++, и начинается следующая итерация l oop.

На второй итерации while-l oop сразу видит num == 2, поэтому устанавливает num = 1, а while l oop заканчивается . Затем for-l oop заканчивается, увеличивая num до 2, и цикл продолжается вечно.

Как говорили другие, вам просто нужно оставить только переменную l oop и использовать другую переменная во внутреннем l oop.

0 голосов
/ 07 мая 2020

Вам нужно ввести новую переменную. Вы выполняете:

for (int num = 5; num < 2000000; num++) {
    /* collatz stuff, which modifies num, and eventually
       causes it to become 1
    */
}

, поэтому, когда часть num++ из for l oop выполняется, num становится 2.

То, что вы хотите, это

for (int start = 5 ; start < 2000000 ; start++) {
    int num = start;
    /* collatz stuff, which modifies num */
}

, поскольку переменная start никогда не изменяется телом l oop, она будет увеличиваться последовательно на 1 без вмешательства.

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