URI Online Judge Erro

278 views
Skip to first unread message

João Gibbon

unread,
Aug 16, 2018, 12:20:14 PM8/16/18
to Python Brasil
Olá pessoal, estou resolvendo os problemas iniciais do URI e travei no 1021, com um problema na saída:

ENUNCIADO:

Leia um valor de ponto flutuante com duas casas decimais. Este valor representa um valor monetário. A seguir, calcule o menor número de notas e moedas possíveis no qual o valor pode ser decomposto. As notas consideradas são de 100, 50, 20, 10, 5, 2. As moedas possíveis são de 1, 0.50, 0.25, 0.10, 0.05 e 0.01. A seguir mostre a relação de notas necessárias.

Entrada

O arquivo de entrada contém um valor de ponto flutuante (0 ≤ ≤ 1000000.00).

Saída

Imprima a quantidade mínima de notas e moedas necessárias para trocar o valor inicial, conforme exemplo fornecido.


MEU CÓDIGO:

valor = float(input())

notas
= [100, 50, 20, 10, 5, 2]
moedas
= [1, 0.50, 0.25, 0.10, 0.05, 0.01]

print('NOTAS:')

for nota in notas:
    num_nota
= valor // nota
    valor
-= nota*num_nota
   
print('{} nota(s) de R$ {:.2f}'.format(int(num_nota), nota))


print('MOEDAS:')
for moeda in moedas:
    num_moeda
= valor // moeda
    valor
-= moeda*num_moeda
   
print('{} moeda(s) de R$ {:.2f}'.format(int(num_moeda), moeda))



Ao rodar com o input 576.73 por exemplo, obtenho a resposta correta, mas na hora de submeter, me retorna um "wrong answer (10%)" que não sei o pq, podem me ajudar?

RESPOSTA:

NOTAS:
5 nota(s) de R$ 100.00
1 nota(s) de R$ 50.00
1 nota(s) de R$ 20.00
0 nota(s) de R$ 10.00
1 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
1 moeda(s) de R$ 1.00
1 moeda(s) de R$ 0.50
0 moeda(s) de R$ 0.25
2 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
3 moeda(s) de R$ 0.01

desde já agradeço,

Junior Phanter

unread,
Aug 16, 2018, 3:28:52 PM8/16/18
to python...@googlegroups.com
Vc já testou com as entradas do udebug?

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/859afaa3-339a-4fef-8d01-460e0f23b433%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Junior Phanter

unread,
Aug 16, 2018, 3:33:04 PM8/16/18
to python...@googlegroups.com
Pode ser que falte uma quebra de linha depois de calcular um número.

Junior Phanter

unread,
Aug 16, 2018, 4:33:53 PM8/16/18
to python...@googlegroups.com
Seu código com o valor 99.99 tem saída:

NOTAS:
0 nota(s) de R$ 100.00

1 nota(s) de R$ 50.00
2 nota(s) de R$ 20.00

0 nota(s) de R$ 10.00
1 nota(s) de R$ 5.00
2 nota(s) de R$ 2.00
MOEDAS:
0 moeda(s) de R$ 1.00

1 moeda(s) de R$ 0.50
1 moeda(s) de R$ 0.25

2 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
3 moeda(s) de R$ 0.01

E é pra ser:

NOTAS:
0 nota(s) de R$ 100.00

1 nota(s) de R$ 50.00
2 nota(s) de R$ 20.00

0 nota(s) de R$ 10.00
1 nota(s) de R$ 5.00
2 nota(s) de R$ 2.00
MOEDAS:
0 moeda(s) de R$ 1.00

1 moeda(s) de R$ 0.50
1 moeda(s) de R$ 0.25

2 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
4 moeda(s) de R$ 0.01

Possíveis razões: perda de precisão por conta do float... em meu código eu multipliquei a entrada por 100 assim como as moedas e notas




Linux - Junior Polegato

unread,
Aug 16, 2018, 4:37:58 PM8/16/18
to python...@googlegroups.com
Em 16-08-2018 10:42, João Gibbon escreveu:
> Olá pessoal, estou resolvendo os problemas iniciais do URI e travei no
> 1021, com um problema na saída:
> [...]

Olá!

        Creio que isso tenha relação com operações envolvendo números
de ponto flutuante, veja:

$ python3
Python 3.6.6 (default, Jun 27 2018, 14:44:17)
[GCC 8.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.03 / 0.01
3.0
>>> 0.03 // 0.01
2.0
>>>

        Para evitar esse tipo de coisa, você deve considerar um erro,
no caso em se tratar de número positivo com duas casas decimais, pode-se
colocar como erro algo na terceira casa em diante somando ao número
principal, seja 0,001 ou 0,0001 ou 0,00001, veja:

>>> 0.030 // 0.01
2.0
>>> 0.031 // 0.01
3.0
>>> 0.0301 // 0.01
3.0
>>> 0.03001 // 0.01
3.0
>>> 0.030001 // 0.01
3.0
>>> 0.0300001 // 0.01
3.0
>>>

        Então no seu código use:

erro = 0.00001
valor = float(input()) + erro


--

[]'s

Junior Polegato

Renan Augusto Cardoso

unread,
Aug 16, 2018, 5:56:06 PM8/16/18
to python...@googlegroups.com
João, no seu código, acho que se vc colocar 'valor += 0.001' na linha 2, os testes iram passar. 


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/859afaa3-339a-4fef-8d01-460e0f23b433%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.

João Gibbon

unread,
Aug 16, 2018, 7:51:21 PM8/16/18
to python...@googlegroups.com
Olá pessoal,
Muito obrigado por responderem...

Sim Renan, acrescentando 0.001 no valor foi aceito, mas continuo nao entendendo o pq da imprecisão...vou debugar pelo Pycharm utilizando o valor que o Junior sugeriu, assim acho que consigo visulizar melhor.

Muito obrigado à tds!!! 😊

Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/eDNFHkJMunI/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.

Junior Phanter

unread,
Aug 16, 2018, 9:12:28 PM8/16/18
to python...@googlegroups.com
João, isto ocorre pq o processador faz operações em binário, então as vezes o resultado dá uma dízima... observe que isso também acontece no sistema decimal que estamos acostumado, por exemplo, 10/3 = 3,33333... uma dízima periódica, então ao fazer o inverso, ou seja, 3,33333 * 3, teremos 9,99999, ou seja, perdemos precisão...

Observe isto no console:



O resultado da divisão deu 11.111111110000001, só que quando fazemos um print ele "humaniza" o resultado, que é o mesmo apresentado na calculadora, ao fazer a operação inversa, perdemos 0.00000001 de precisão ao usar o resultado "humanizado".

Muito obrigado à tds!!! 😊


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/859afaa3-339a-4fef-8d01-460e0f23b433%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/CAFoqyshgTpRoCJSqQig6ucFF6RRpO6J8WGk3-7zsQqFabMQQQA%40mail.gmail.com.
Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/eDNFHkJMunI/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/CAN_wjRR1maHfz%3DboapSnELPkR7uQDBGV9nn-0pWAQMRHr11ZcA%40mail.gmail.com.
Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages