Бесконечный цикл при некоторых условиях, почему?
n = int(input()) kup = 0 while n != 0: if n-500 >= 0: n-=500 kup += 1 while n != 0: if n-500 >= 0: kup += 1 else: break elif n-200 >= 0: kup += 1 n-= 200 while n != 0: if n-200 >= 0: kup += 1 n-=200 else: break elif n-100 >= 0: kup += 1 n-= 100 while n != 0: if n-100 == 0: kup += 1 n-=100 else: break elif n-50 >= 0: kup += 1 n-= 50 while n != 0: if n-50 >= 0: kup += 1 n-=50 else: break elif n-20 == 0: kup += 1 n-= 20 while n != 0: if n-20 >= 0: kup += 1 n-=20 else: break elif n-10 == 0: kup += 1 n-= 10 while n != 0: if n-10 >= 0: kup += 1 n-=10 else: break elif n-5 == 0: kup += 1 n-= 5 while n != 0: if n-5 >= 0: kup += 1 n-=5 else: break elif n-2 == 0: kup += 1 n-= 2 while n != 0: if n-2 >= 0: kup += 1 n-=2 else: break elif n-1 == 0: kup += 1 n-= 1 while n != 0: if n-1 >= 0: kup += 1 n-=1 else: break print(kup) |
n = int(input()) kup = 0 while n != 0: if n-500 >= 0: n-=500 kup += 1 while n != 0: if n-500 >= 0: kup += 1 else: break elif n-200 >= 0: kup += 1 n-= 200 while n != 0: if n-200 >= 0: kup += 1 n-=200 else: break elif n-100 >= 0: kup += 1 n-= 100 while n != 0: if n-100 == 0: kup += 1 n-=100 else: break elif n-50 >= 0: kup += 1 n-= 50 while n != 0: if n-50 >= 0: kup += 1 n-=50 else: break elif n-20 == 0: kup += 1 n-= 20 while n != 0: if n-20 >= 0: kup += 1 n-=20 else: break elif n-10 == 0: kup += 1 n-= 10 while n != 0: if n-10 >= 0: kup += 1 n-=10 else: break elif n-5 == 0: kup += 1 n-= 5 while n != 0: if n-5 >= 0: kup += 1 n-=5 else: break elif n-2 == 0: kup += 1 n-= 2 while n != 0: if n-2 >= 0: kup += 1 n-=2 else: break elif n-1 == 0: kup += 1 n-= 1 while n != 0: if n-1 >= 0: kup += 1 n-=1 else: break print(kup)
Возможно не оптимизирован, она считает сколько минимально купюр надо чтобы было столько денег, при некоторых значениях просто ничего не выводит(думаю не выходит из цикла). Что делать? Как решить?
Дополнительно:
Ответы:
Что делать? Как решить?
дебажить, в простом случае расставить принты, либо освоить инструменты, тот же pdb (сейчас он вообще в одну функцию вызывается breakpoint)
Вам нужно разобраться с базовыми операциями - % , // .
from enum import Enum class Banknotes(Enum): ONE = 1 TWO = 2 FIVE = 5 TEN = 10 TWENTY = 20 FIFTY = 50 ONE_HUNDRED = 100 TWO_HUNDRED = 200 FIVE_HUNDRED = 500 ONE_THOUSAND = 1000 def get_min_count_banknotes(amount: int) -> dict: all_banknotes = {} for b in reversed(Banknotes): all_banknotes[b.name] = 0 while amount // b.value > 0: all_banknotes[b.name] += 1 amount -= b.value banknotes = {banknote: count for banknote, count in all_banknotes.items() if count != 0} return banknotes def get_total_count_banknotes(amount: int) -> int: ret = get_min_count_banknotes(amount) count = sum(ret.values()) return count if __name__ == '__main__': # n = int(input('Введите сумму')) n = 1234 b_notes = get_min_count_banknotes(n) for k, v in b_notes.items(): print(f'Купюра - {k} , количество - {v}') cnt_b_notes = get_total_count_banknotes(n) print(f'Всего купюр - {cnt_b_notes}') # Купюра - ONE_THOUSAND, количество - 1 # Купюра - TWO_HUNDRED, количество - 1 # Купюра - TWENTY, количество - 1 # Купюра - TEN, количество - 1 # Купюра - TWO, количество - 2 # Всего купюр - 6 |
from enum import Enum class Banknotes(Enum): ONE = 1 TWO = 2 FIVE = 5 TEN = 10 TWENTY = 20 FIFTY = 50 ONE_HUNDRED = 100 TWO_HUNDRED = 200 FIVE_HUNDRED = 500 ONE_THOUSAND = 1000 def get_min_count_banknotes(amount: int) -> dict: all_banknotes = {} for b in reversed(Banknotes): all_banknotes[b.name] = 0 while amount // b.value > 0: all_banknotes[b.name] += 1 amount -= b.value banknotes = {banknote: count for banknote, count in all_banknotes.items() if count != 0} return banknotes def get_total_count_banknotes(amount: int) -> int: ret = get_min_count_banknotes(amount) count = sum(ret.values()) return count if __name__ == '__main__': # n = int(input('Введите сумму')) n = 1234 b_notes = get_min_count_banknotes(n) for k, v in b_notes.items(): print(f'Купюра - {k} , количество - {v}') cnt_b_notes = get_total_count_banknotes(n) print(f'Всего купюр - {cnt_b_notes}') # Купюра - ONE_THOUSAND, количество - 1 # Купюра - TWO_HUNDRED, количество - 1 # Купюра - TWENTY, количество - 1 # Купюра - TEN, количество - 1 # Купюра - TWO, количество - 2 # Всего купюр - 6
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Бесконечный цикл в программировании может возникать по разным причинам. Одной из наиболее распространенных причин является неправильное условие выхода из цикла. Если условие, которое должно прерывать выполнение цикла, никогда не выполняется, то цикл будет продолжать выполняться бесконечно.
Другой причиной может быть неправильная логика программы внутри цикла. Например, если в теле цикла не происходит изменение условия выхода из цикла, то цикл будет выполняться бесконечно.
Также, бесконечный цикл может возникать из-за ошибок в логике программы, например, если происходит зацикливание из-за неправильного управления указателями или переменными.
Для предотвращения бесконечного цикла необходимо тщательно проверять условия выхода из цикла и убедиться, что они правильно настроены. Также следует избегать ненужных операций в цикле, которые могут привести к его бесконечному выполнению.
Пример кода на PHP, который может привести к бесконечному циклу:
$counter = 0; while ($counter < 10) { // забыли увеличить счетчик }
В данном примере счетчик $counter никогда не увеличивается внутри цикла, поэтому условие $counter < 10 всегда будет истинным, и цикл будет выполняться бесконечно. Для исправления данной проблемы необходимо добавить инструкцию увеличения счетчика внутри цикла:
$counter = 0; while ($counter < 10) { // какие-то операции $counter++; }
Таким образом, правильное написание условий и логики в циклах поможет избежать бесконечного выполнения программы.