#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)
, то есть в конце каждой итерации цикла fori
равно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
цикла.