Почему цикл выполняется бесконечное количество раз?

#c

#c

Вопрос:

Друзья, моя цель — найти числа с нечетными суммами из чисел 1-99 на языке C и вывести их на экран. Чтобы попробовать, я сузил масштаб и написал 5 вместо 99 в коде. Однако есть проблема, этот код, который, я думаю, очень хорошо работает в логике в моей голове, входит в бесконечный цикл. Я не мог найти, что делать. Как вы думаете, как я это исправлю?

Ожидаемый результат (думаю, 5 вместо 99): «Сумма цифр нечетная: 1 Сумма цифр нечетная: 3»

 int main() {
    int n, m, result, temp;

    for (int i = 1; i < 5; i  ) {
        temp = i;

        while (i > 0) {
            m = i % 10;
            result  = m;
            i = i / 10;
        }

        if (result % 2 != 0) {
            printf("%d", temp);
        }
    }   
}
 

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

1. Ожидаемый результат не соответствует коду. Ничто там не может вывести «Сумму цифр …».

2. Какой цикл бесконечен? Внешний, конечно, гарантированно будет бесконечным, ожидая, что i будет 5 или больше, в то время как внутренний цикл всегда гарантирует, что i заканчивается 0…

3. Рассмотрим ваш цикл for . Он используется i для увеличения с 1 до 4. Но затем цикл while изменяется i . Тест в этом цикле i должен быть больше нуля. Итак, если / когда он завершается, i равно или меньше нуля. Остановится ли for цикл когда-нибудь?

4. Может быть, потому, что вы изменяете i i = i/10 и делаете это while(i > 0) , то есть в конце каждой итерации цикла for i равно 0 . В python это, вероятно, сработало бы, если бы вы делали for i in range(5) , потому что это предварительно вычисляет значения i .

5. В дополнение ко всему остальному, result неинициализируется при первом чтении ( result = ... ) . Это неопределенное поведение . Сначала инициализируйте его ( int result = 0; ).

Ответ №1:

Вы используете i в своем цикле, и все же используете i = i / 10 в этом цикле antill i is 0 . Это означает, что i это застревает как 1 .

Вам понадобится либо другая переменная для итерации цифр, либо для переключения использования i и temp , чтобы оно i изменялось только при увеличении цикла:

 int main()    
{
  int n, m, result, temp;
  for(int i = 1; i < 5; i  )
  {
    result = 0;
    temp = i;
    while(temp>0)
    {
        m = temp % 10;
        result  = m;
        temp = temp / 10;
    }
    if (result %2!=0)
    {
        printf("%d", i);
    }
  } 
  return 0;
}
 

Редактировать: я также пропустил, что вы забыли инициализировать result начальным значением, поэтому вы в основном продолжаете добавлять значение мусора. Вы должны инициализировать его с 0 помощью на каждой итерации.

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

1. Да, это остановило повторение цикла. Но я все еще не получаю желаемый результат. Это вывод вашего кода: «1 2»

2. Посмотрите на мою правку, основанную на добром комментарии чукса выше меня

3. Да, мы это сделали! На самом деле, вы это сделали. Но я понял, для чего вы это сделали.

Ответ №2:

Вы создаете копию i in temp .
Но затем вы не используете temp и не манипулируете i во внутреннем цикле.
Придерживайтесь своего первоначального плана и играйте только temp во внутреннем цикле.

Вероятно, в какой-то момент вы также захотите выполнить инициализацию / сброс result .

Ответ №3:

Вам нужно сбросить значение i после while цикла. Как указано, значение i равно нулю после while цикла.