Crie um algoritmo de caixa eletrônico que lê a quantidade de dinheiro a ser sacado e imprime a menor quantidade de notas a ser dada ao usuário. A sua máquina de saque eletrônico é carregada com 1.000 (mil) notas de 100, 50, 20, 10, 5 e 1 cada. Imprimir também a quantidade de cada nota a ser dada ao usuário. Lembre-se que você tem uma quantidade finita de cada tipo de nota. O final da leitura é marcado pelo valor 0 que não deve ser calculado.
Exemplo: 98 = uma nota de 50, duas notas de 20, uma nota de 5, e três notas de 1.
Perceba que a cada saque há uma quantidade menor de cada tipo de notas.
Outra situação é quando não é possível sacar o dinheiro com a quantidade de notas existentes. Neste caso, o programa deve cancelar a operação e informar o usuário que não é possível realizar o saque.

Passo 1

Beleza, então a gente tem que criar um algoritmo para um caixa eletrônico. O objetivo é ler quanto o usuário quer sacar e devolver a menor quantidade possível de notas usando as disponíveis: 100, 50, 20, 10, 5 e 1. A gente também precisa controlar quantas notas já foram usadas, já que cada tipo tem apenas 1000 disponíveis. Se não der pra sacar o valor solicitado com as notas que temos, a gente avisa pro usuário que não é possível.

Passo 2

Primeiro, vamos definir as notas que o caixa tem e a quantidade disponível de cada uma. A gente pode usar uma lista ou um dicionário para isso. Vamos optar por um dicionário para facilitar a manipulação.
notas = {
    100: 1000,
    50: 1000,
    20: 1000,
    10: 1000,
    5: 1000,
    1: 1000
}

Passo 3

Agora, precisamos ler o valor que o usuário quer sacar. Vamos continuar lendo até que o usuário digite 0, que indica o fim.
while True:
    valor = int(input("Digite o valor a ser sacado (0 para encerrar): "))
    if valor == 0:
        break
    # Aqui vai o resto do código para processar o saque

Passo 4

Dentro do loop, vamos calcular quantas notas de cada tipo serão necessárias. A ideia é sempre tentar usar a maior nota possível primeiro para minimizar a quantidade de notas.
    saque = valor
    notas_sacadas = {}
    for nota in sorted(notas.keys(), reverse=True):
        quantidade = min(saque // nota, notas[nota])
        if quantidade > 0:
            notas_sacadas[nota] = quantidade
            saque -= nota * quantidade

Passo 5

Depois de calcular, vamos verificar se conseguimos sacar o valor solicitado. Se o saque não for 0, significa que não conseguimos com as notas disponíveis.
    if saque == 0:
        print("Notas sacadas:")
        for nota, quantidade in notas_sacadas.items():
            print(f"{quantidade} nota(s) de R${nota}")
            notas[nota] -= quantidade  # Atualiza a quantidade de notas disponíveis
    else:
        print("Não é possível realizar o saque com as notas disponíveis.")

Resposta

Aqui está o algoritmo completo:
notas = {
    100: 1000,
    50: 1000,
    20: 1000,
    10: 1000,
    5: 1000,
    1: 1000
}

while True:
    valor = int(input("Digite o valor a ser sacado (0 para encerrar): "))
    if valor == 0:
        break
    if valor < 0:
        print("Valor inválido. Tente novamente.")
        continue
    saque = valor
    notas_sacadas = {}
    for nota in sorted(notas.keys(), reverse=True):
        quantidade = min(saque // nota, notas[nota])
        if quantidade > 0:
            notas_sacadas[nota] = quantidade
            saque -= nota * quantidade
    if saque == 0:
        print("Notas sacadas:")
        for nota, quantidade in notas_sacadas.items():
            print(f"{quantidade} nota(s) de R${nota}")
            notas[nota] -= quantidade
    else:
        print("Não é possível realizar o saque com as notas disponíveis.")
Esse código vai ler o valor do saque, calcular as notas necessárias usando a menor quantidade possível, atualizar a quantidade de notas disponíveis e informar o usuário. Se não der pra sacar, ele avisa que não é possível.

Exercícios relacionados