Циклы, работающие бесконечно для больших входных данных

#c #loops #do-while #cs50

#c #петли #do-while #cs50

Вопрос:

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

 #include <cs50.h>
#include <stdio.h>

int main(void) {
    // TODO: Prompt for start size
    int n;

    do {
        n = get_int("Enter the starting size of your llamas: ");
    } while (n <= 8);

    // TODO: Prompt for end size
    int j;

    do {
        j = get_int("Enter the Ending size of your llamas: ");
    } while (j <= n);

    // TODO: Calculate number of years until we reach threshold
    int k = 0;

    do {
        n = n   (n/3) - (n/4);
        printf("The number is %in", n);
        k  ;
    } while (n != j);

    // TODO: Print number of years
    printf("The number is %in", k);
}
 

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

Комментарии:

1. Вы будете рады услышать, что вам не нужна ничья помощь, чтобы разобраться в этом, просто инструмент, который у вас уже есть: ваш отладчик! Это именно то, для чего нужен отладчик. Он запускает вашу программу по одной строке за раз и показывает вам, что происходит. Знание того, как использовать отладчик, является необходимым навыком для каждого разработчика C , без исключений. С помощью вашего отладчика вы сможете быстро находить все проблемы в этой и всех будущих программах, которые вы пишете, не обращаясь ни к кому за помощью. Вы уже пробовали использовать свой отладчик? Если нет, то почему бы и нет? Что вам показал ваш отладчик?

2. Итак, какие числа вы ввели, и что печатают все эти printf строки?

3. Что произойдет, если n меньше, чем j , но n (n/3) - (n/4) больше, чем j ?

Ответ №1:

Для больших чисел n увеличивается больше, чем 1 на каждой итерации, поэтому возможно, что оно становится больше, чем j без того, чтобы сначала быть равным ему.

Измените тест while(n != j); на while(n < j);

Комментарии:

1. Кроме того, для n < 9 этого может быть бесконечный цикл, когда n/3 == n/4 (из-за целочисленного деления, которое усекается), в частности для n = 1, 2, 4, 5, 8 .

2. @dxiv: да, но цикл ввода повторяется while (n <= 8);

3. Хороший улов, я пропустил эту часть.