Bom dia, sou iniciante e estou estudando programação em um site que sugere problemas para serem resolvidos, o problema proposto foi o seguinte:
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.
Imprima a quantidade mínima de notas e moedas necessárias para trocar o valor inicial.
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;
float n;
scanf("%f",&n);
while(n>=100){
a++;
n=n-100;
}
while(n>=50){
b++;
n=n-50;
}
while(n>=20){
c++;
n=n-20;
}
while(n>=10){
d++;
n=n-10;
}
while(n>=5){
e++;
n=n-5;
}
while(n>=2){
f++;
n=n-2;
}
while(n>=1){
g++;
n=n-1;
}
while(n>=0.5){
h++;
n=n-0.5;
}
while(n>=0.25){
i++;
n=n-0.25;
}
while(n>=0.10){
j++;
n=n-0.10;
}
while(n>=0.05){
k++;
n=n-0.05;
}
while(n>0.00){
l++;
n=n-0.01;
}
printf("NOTAS:\n");
printf("%d nota(s) de R$ 100.00\n",a);
printf("%d nota(s) de R$ 50.00\n",b);
printf("%d nota(s) de R$ 20.00\n",c);
printf("%d nota(s) de R$ 10.00\n",d);
printf("%d nota(s) de R$ 5.00\n",e);
printf("%d nota(s) de R$ 2.00\n",f);
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n",g);
printf("%d moeda(s) de R$ 0.50\n",h);
printf("%d moeda(s) de R$ 0.25\n",i);
printf("%d moeda(s) de R$ 0.10\n",j);
printf("%d moeda(s) de R$ 0.05\n",k);
printf("%d moeda(s) de R$ 0.01\n",l);
return 0;
}
Mas o problema é que se eu entrar com o valor de 91.01 da erro na precisão do calculo e ele volta que eu tenho que dar 2 moedas de 0.001 centavo.
o certo seria sair assim :
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
0 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
1 moeda(s) de R$ 1.00
0 moeda(s) de R$ 0.50
0 moeda(s) de R$ 0.25
0 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
1 moeda(s) de R$ 0.01
mas esta saindo assim
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
0 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
1 moeda(s) de R$ 1.00
0 moeda(s) de R$ 0.50
0 moeda(s) de R$ 0.25
0 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
2 moeda(s) de R$ 0.01
continuando...
eu fui tentar descobrir porque tava dando esse erro e fiz o seguinte:
#include <stdio.h>
#include <stdlib.h>
int main()
{
float n=0;
scanf("%f", &n);
printf("%f", n);
return 0;
}
se eu entrar com o valor de 91.01
no printf sai o valor de 91.010002
eu presumo que o erro esta ai... esse 0002 que é acrescentado pela variavel ser float acaba mudando o valor no calculo e a precisão sai errada, como eu faço pra arrumar isso?
vlw pela atenção.
o site que eu pego os problemas é o www.urionlinejudge.com.br e esse problema em questão é o problema de numero 1021.