Для цикла, который не увеличивается или тест не завершается

У меня есть этот раздел кода, который должен найти последовательность Коллатца всех целых чисел в заданном диапазоне, определенном пользовательским вводом. Проблема в том, что в for петли, current_number никогда не увеличивается или во внутреннем while петли, current_number != 1 никогда не подведет Что мне не хватает?

while (lower != 0 && upper != 0) {
    cout << "Lower bound (integer): ";
    cin >> lower;
    cout << "Upper bound (integer): ";
    cin >> upper;
    if (lower == 0 || upper == 0)
        return 0;
    for (current_number = lower; current_number <= upper;
        ++current_number) {
            //cout << current_number << endl;
            counter = 0;
            sequence = sequence + to_string(current_number) + ", ";
            while (current_number != 1) {
                if (current_number % 2 == 0) {
                    current_number = current_number / 2;
                    sequence = sequence + to_string(current_number) + ", ";
                }
                else {
                    current_number = current_number * 3 + 1;
                    sequence = sequence + to_string(current_number) + ", ";
                }
                cout << current_number << endl;
                ++counter;
            }
            //if (counter > longest) {
            //  longest = counter;
            //  the_longest_seed = current_number;
            //}
    }
    cout << sequence << endl;

}

3 ответа

Решение

Рядом с другой ошибкой, вы также используете current_number перебирать диапазон ввода, и вы меняете его для вывода последовательности Коллатца. Вы должны изменить копию current_number,

current_number % 2 == 0 верно для всех current_number = 0, 2, 4, 6, ...,

Когда это происходит, вы устанавливаете current_number быть current_number / 2.. Так когда current_number 2, вы устанавливаете его на 1, а затем увеличиваете его (++current_number), то опять 2 (!= 1), так что вы войдете в while цикл, то потому что 2 % 2 = 0 Вы снова установите его на 1.. И так далее..:_(

Совет на всю жизнь: отлаживайте свой код, это сэкономит время, усилия и иногда деньги.

По поводу бесперебойного цикла. Если current_number!= 1 и это не 2 (если это так, другой парень ответил), он входит в цикл while и никогда не заканчивается, потому что...

Допустим, это 3:

3% 2! = 0, поэтому становится 10,

10% 2 == 0, так что становится 5,

5% 2! = 0, поэтому становится 16

...

Никогда не терпит неудачу.

Другие вопросы по тегам