Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro com entrada específica

Opa, tudo certo? Resolvendo alguns exercícios no URI pra praticar, comecei a fazer a questão 1021 (https://www.urionlinejudge.com.br/judge/pt/problems/view/1021), porém quando envio a minha solução, da Wrong Answer (10%). Pesquisando um pouco, descobri que se eu usar o 93.55 como input, o código não dá a resposta certa, mas não consegui encontrar o erro. Podem me ajudar?

    N = float(input())


    total = N

    notaDeCem = 0
    notaDeCinquenta = 0
    notaDeVinte = 0
    notaDeDez = 0
    notaDeCinco = 0
    notaDeDois = 0

    moedaDeUm = 0
    moedaDe50 = 0
    moedaDe25 = 0
    moedaDe10 = 0
    moedaDe05 = 0
    moedaDe01 = 0

    while total >= 100.00:
        total = total - 100.00
        notaDeCem += 1

    while total >= 50.00:
        total = total - 50.00
        notaDeCinquenta += 1

    while total >= 20.00:
        total = total - 20.00
        notaDeVinte += 1

    while total >= 10.00:
        total = total - 10.00
        notaDeDez += 1

    while total >= 5.00:
        total = total - 5.00
        notaDeCinco += 1

    while total >= 2.00:
        total = total - 2.00
        notaDeDois += 1

    while total >= 1.00:
        total = total - 1.00
        moedaDeUm += 1

    while total >= 0.50:
        total = total - 0.50
        moedaDe50 += 1

    while total >= 0.25:
        total = total - 0.25
        moedaDe25 += 1

    while total >= 0.10:
        total = total - 0.10
        moedaDe10 += 1

    while total >= 0.05:
        total = total - 0.05
        moedaDe05 += 1

    while total >= 0.01:
        total = total - 0.01
        moedaDe01 += 1

    print("NOTAS:")
    print("{} nota(s) de R$ 100.00".format(notaDeCem))
    print("{} nota(s) de R$ 50.00".format(notaDeCinquenta))
    print("{} nota(s) de R$ 20.00".format(notaDeVinte))
    print("{} nota(s) de R$ 10.00".format(notaDeDez))
    print("{} nota(s) de R$ 5.00".format(notaDeCinco))
    print("{} nota(s) de R$ 2.00".format(notaDeDois))
    print("MOEDAS:")
    print("{} moeda(s) de R$ 1.00".format(moedaDeUm))
    print("{} moeda(s) de R$ 0.50".format(moedaDe50))
    print("{} moeda(s) de R$ 0.25".format(moedaDe25))
    print("{} moeda(s) de R$ 0.10".format(moedaDe10))
    print("{} moeda(s) de R$ 0.05".format(moedaDe05))
    print("{} moeda(s) de R$ 0.01".format(moedaDe01))

Podem me ajudar a encontrar o erro?

Valeu!

4 respostas

Não encontrei erro mas percebi que a calculadora perde a precisão quando o número fica menor que 20.

while total >= 100.00 :
    total = total - 100.00
    print(total)
    notaDeCem += 1

while total >= 50.00 :
    total = total - 50.00
    print(total)
    notaDeCinquenta += 1

while total >= 20.00 :
    total = total - 20.00
    print(total)
    notaDeVinte += 1

Acrescente o print(total) para depurar e veja. Não encontrei como resolver.

Boa tarde ! Eu não vou saber explicar com detalhes mas é provável que tenha algo a ver com esse ponto flutuante, se você fizer um teste no console vai ver que 43.55-20.00 da 23.549999999999997e não 23.55. Uma possível solução é separar as notas e as moedas em dois inteiros, conforme abaixo:

N = input()

total_notas = int(N[:-3])
total_moedas = int(N[-2:])
notaDeCem = 0
notaDeCinquenta = 0
notaDeVinte = 0
notaDeDez = 0
notaDeCinco = 0
notaDeDois = 0

moedaDeUm = 0
moedaDe50 = 0
moedaDe25 = 0
moedaDe10 = 0
moedaDe05 = 0
moedaDe01 = 0

while total_notas >= 100:
    total_notas = total_notas - 100
    notaDeCem += 1

while total_notas >= 50:
    total_notas = total_notas - 50
    notaDeCinquenta += 1

while total_notas >= 20:
    total_notas = total_notas - 20
    notaDeVinte += 1

while total_notas >= 10:
    total_notas = total_notas - 10
    notaDeDez += 1

while total_notas >= 5:
    total_notas = total_notas - 5
    notaDeCinco += 1

while total_notas >= 2:
    total_notas = total_notas - 2
    notaDeDois += 1

while total_notas >= 1:
    total_notas = total_notas - 1
    moedaDeUm += 1

while total_moedas >= 50:
    total_moedas = total_moedas - 50
    moedaDe50 += 1

while total_moedas >= 25:
    total_moedas = total_moedas - 25
    moedaDe25 += 1

while total_moedas >= 10:
    total_moedas = total_moedas - 10
    moedaDe10 += 1

while total_moedas >= 5:
    total_moedas = total_moedas - 5
    moedaDe05 += 1

while total_moedas >= 1:
    total_moedas = total_moedas - 1
    moedaDe01 += 1

print("NOTAS:")
print("{} nota(s) de R$ 100.00".format(notaDeCem))
print("{} nota(s) de R$ 50.00".format(notaDeCinquenta))
print("{} nota(s) de R$ 20.00".format(notaDeVinte))
print("{} nota(s) de R$ 10.00".format(notaDeDez))
print("{} nota(s) de R$ 5.00".format(notaDeCinco))
print("{} nota(s) de R$ 2.00".format(notaDeDois))
print("MOEDAS:")
print("{} moeda(s) de R$ 1.00".format(moedaDeUm))
print("{} moeda(s) de R$ 0.50".format(moedaDe50))
print("{} moeda(s) de R$ 0.25".format(moedaDe25))
print("{} moeda(s) de R$ 0.10".format(moedaDe10))
print("{} moeda(s) de R$ 0.05".format(moedaDe05))
print("{} moeda(s) de R$ 0.01".format(moedaDe01))

Porém ainda vai precisar tratar a entrada de algum número sem casas decimais. Talvez exista uma forma melhor de resolver isso além do meu conhecimento, mas espero que eu tenha ajudado de alguma forma.

Opa, galera. Realmente o problema é a falta de precisão quando acontece às subtrações, mas qual seria a melhor forma de resolver isso? Vou tentar a sugestão do Vagner assim que eu chegar em casa, mas será que existe uma outra forma?

De qualquer forma, valeu pela ajuda. Se o URI aceitar, marco aqui como solução.

solução!

Bom, pessoal, só para fins de atualização, caso alguém tenha a mesma dúvida que eu algum dia:

O problema foi solucionado e aceito apenas somando 0.001 à entrada do usuário, e isso se deve ao problema com as subtrações usando floats citadas pelo Vagner.

De qualquer forma, acredito que a única solução possível para esse problema seria essa.