Ir ao conteúdo

C++ Site URI questão 21 Wrong answer (10%)


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

ola estou tentando resolver a questão 21 do site da uri, mas só da Wrong answer (10%), não entendo pois o site não explica qual é o problema do programa, alguém poderia me dizer qual é o problema, seja abaixo o programa.

 

#include <iostream>
#include <math.h>
#include <vector>

using namespace std;

int main()
{
    double valor;
    int Not,Mod;
    
    cin >> valor;

    cout << fixed;
    cout.precision(2);
    cout << "NOTAS:" << endl;

    Not = (int) valor / 100;
    cout << Not << " nota(s) de R$ 100.00" << endl;
    valor = fmod(valor,100);

    Not = (int) valor / 50;
    cout << Not << " nota(s) de R$ 50.00" << endl;
    valor = fmod(valor,50);

    Not = (int) valor / 20;
    cout << Not << " nota(s) de R$ 20.00" << endl;
    valor = fmod(valor,20);

    Not = (int) valor / 10;
    cout << Not << " nota(s) de R$ 10.00" << endl;
    valor = fmod(valor,10);

    Not = (int) valor / 5;
    cout << Not << " nota(s) de R$ 5.00" << endl;
    valor = fmod(valor,5);

    Not = (int) valor / 2;
    cout << Not << " nota(s) de R$ 2.00" << endl;
    valor = fmod(valor,2);

    cout << "MOEDAS:" << endl;
    Mod =  valor / 1;
    cout << Mod << " nota(s) de R$ 1.00" << endl;
    valor = fmod(valor,1);

    Mod =  valor / 0.50;
    cout << Mod << " nota(s) de R$ 00.50" << endl;
    valor = fmod(valor,0.50);

    Mod =  valor / 0.25;
    cout << Mod << " nota(s) de R$ 00.25" << endl;
    valor = fmod(valor,0.25);

    Mod =  valor / 0.10;
    cout << Mod << " nota(s) de R$ 00.10" << endl;
    valor = fmod(valor, 0.10);

    Mod =  valor / 0.05;
    cout << Mod << " nota(s) de R$ 00.05" << endl;
    valor = fmod(valor, 0.05);

    Mod =  valor / 0.01;
    cout << Mod << " nota(s) de R$ 00.01" << endl;
    valor = fmod(valor, 0.01);

    return 0;
}

 

Ps: fiz desta forma para o site não reclamar.

  • Curtir 1
Postado
1 hora atrás, Miguel_G_Silvestre disse:

o site não explica qual é o problema do programa

explica sim clique em listar e veja qual tipo do problema  veja porque acontece esse tipo de problema.

2.png.0e182432c8a76b64bdb21d9392abb9b9.png1.png.d0857c50d0d744840af294f75909677b.png

  • Curtir 1
  • Obrigado 1
Postado
9 minutos atrás, devair1010 disse:

@Miguel_G_Silvestre      não encontrei essa questão no uri , não , ali eles começam de 1001 em diante ,  mas parece que esse erro pode ser por de apresentação , por exemplo no final precisa dar uma quebra de linha .

e a questão 1021 Notas e Moedas, no modulo iniciante

  • Amei 1
  • Solução
Postado

@Miguel_G_Silvestre   no seu código você está escrevendo nota(s) mas no site a resposta é  moeda(s) , apesar de acertar isso  ainda recebi 100% de erro .  

mas usando um outro código , recebi 0 % de erro e um  accepted  :

#include <iostream>
using namespace std;

int main() {
    double n100, n50, n20, n10, n5, n2;
    double m1, m50, m25, m10, m05, m01;
    double n;

    cin >> n;
    int notas = n;
    int moedas = (n - notas) * 100;

    if((moedas * 1000) % 10 == 9){
        moedas++;
    }


    n100 = notas/100;
    notas = notas%100;
    n50 = notas/50;
    notas = notas%50;
    n20 = notas/20;
    notas = notas%20;
    n10 = notas/10;
    notas = notas%10;
    n5 = notas/5;
    notas = notas%5;
    n2 = notas/2;
    notas = notas%2;

    m1 = notas/1;
    notas = notas%1;
    m50 = moedas/50;
    moedas = moedas%50;
    m25 = moedas/25;
    moedas = moedas%25;
    m10 = moedas/10;
    moedas = moedas%10;
    m05 = moedas/5;
    moedas = moedas%5;
    m01 = moedas/1;

    cout << "NOTAS:" << endl; 
    cout << n100 << " nota(s) de R$ 100.00" << endl;
    cout << n50 << " nota(s) de R$ 50.00" << endl;
    cout << n20 << " nota(s) de R$ 20.00" << endl;
    cout << n10 << " nota(s) de R$ 10.00" << endl;
    cout << n5 << " nota(s) de R$ 5.00" << endl;
    cout << n2 << " nota(s) de R$ 2.00" << endl;
    cout << "MOEDAS:" << endl;
    cout << m1 << " moeda(s) de R$ 1.00" << endl;
    cout << m50 << " moeda(s) de R$ 0.50" << endl;
    cout << m25 << " moeda(s) de R$ 0.25" << endl;
    cout << m10 << " moeda(s) de R$ 0.10" << endl;
    cout << m05 << " moeda(s) de R$ 0.05" << endl;
    cout << m01 << " moeda(s) de R$ 0.01" << endl;

    return 0;
} 

 

  • Curtir 1
Postado
4 minutos atrás, devair1010 disse:

@Miguel_G_Silvestre   no seu código você está escrevendo nota(s) mas no site a resposta é  moeda(s) , apesar de acertar isso  ainda recebi 100% de erro .  

 

Isso trata-se de um problema chamado ponto-flutuante da morte. Não irei explicar aqui este problema.

Mas não use double ou float, e sim long.

 

minha solução ficou assim:

 

#include <stdio.h>

int main()
{
    long notas_centavos[6] = { 10000, 5000, 2000, 1000, 500, 200 };
    long moedas_centavos[6] = { 100, 50, 25, 10, 5, 1 };

    double valor;
    scanf("%lf", &valor);

    long centavos = valor * 100;

    printf("NOTAS:\n");
    for (int i = 0; i < 6; i++)
    {
        int no_notas = centavos / notas_centavos[i];
        centavos %= notas_centavos[i];
        printf("%d nota(s) de R$ %.2lf\n", no_notas, (notas_centavos[i] / 100.0));
    }

    printf("MOEDAS:\n");
    for (int i = 0; i < 6; i++)
    {
        int no_moeda = centavos / moedas_centavos[i];
        centavos %= moedas_centavos[i];
        printf("%d moeda(s) de R$ %.2lf\n", no_moeda, (moedas_centavos[i] / 100.0));
    }

    return 0;
}

 

  • Curtir 1
  • Amei 1
Postado

@Matheus Maldi

O problema deve estar na formatação, você está escrevendo:

nota(s) de R$ 00.50

Em vez de:

nota(s) de R$ 0.50

fiz a alteração mas ainda esta dando problema

adicionado 5 minutos depois

@devair1010 deu certo sua questão

adicionado 7 minutos depois

@Matheus Maldi sobre (problema chamado ponto-flutuante da morte), onde eu acho mais sobre isso tem algum poste neste fórum falando sobre isso?

e sua questão também deu certo.

  • Curtir 1
Postado
27 minutos atrás, Miguel_G_Silvestre disse:

 

@Matheus Maldi sobre (problema chamado ponto-flutuante da morte), onde eu acho mais sobre isso tem algum poste neste fórum falando sobre isso?

 

 

Procure por "float are evil"

 

 

Basicamente é por que com 0.1 + 0.2 = 0.30000000000000004 dependendo da implementação do ponto flutuante

O problema no seu algoritmo é que em algum momento a variável que você ficou somando que deveria ter valor de 0.01 fica com o valor 0.009999998, que é bem próximo mas não igual.

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...