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

Как можно оптимизировать представленный код на Python, который считает количество купюр определенного номинала для переданной суммы?
  • 26 марта 2024 г. 17:09
Ответы на вопрос 3
Бесконечный цикл может возникать при определённых условиях из-за неправильной логики программы или ошибки в коде, которая приводит к тому, что условие выхода из цикла не выполняется, и программа продолжает выполняться вечно.

Чтобы оптимизировать код на Python для подсчета количества купюр, можно использовать более эффективный алгоритм. Например, можно создать словарь с номиналами купюр и использовать цикл для итерации по ключам словаря, вычитая из переданной суммы каждый раз текущий номинал купюры и увеличивая счетчик соответствующего значения в словаре.

Пример оптимизированного кода:

```python
def count_banknotes(amount):
    denominations = {1000: 0, 500: 0, 200: 0, 100: 0, 50: 0, 20: 0, 10: 0, 5: 0, 2: 0, 1: 0}
    
    for denomination in denominations.keys():
        while amount >= denomination:
            amount -= denomination
            denominations[denomination] += 1
    
    return denominations

amount = 2568
result = count_banknotes(amount)
for denomination, count in result.items():
  if count > 0:
    print(f'{count} banknotes of {denomination}')
```

Этот код более компактен, эффективен и понятен, чем предыдущая реализация, и дает тот же результат.
Что делать? Как решить?
дебажить, в простом случае расставить принты, либо освоить инструменты, тот же 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
Похожие вопросы