Jquery: calculate the number of banknotes of the cashout value (deliver as few as possible)

Asked

Viewed 1,847 times

4

I’m solving an exercise that I’m having doubts about, it refers to a bank system, in which when I present the withdrawal value, I should receive the least possible number of notes for the indicated value, I should also use the recursive method. Follow below what I’ve done so far:

Question: The Looting System - R$ 80,00 drawing; - Box returns 1 note R$ 50,00; - Box returns 1 note R$ 20,00; - Box returns 1 note R$ 10.00.

As few notes as possible should be returned. Available notes: R$ 100,00, R$ 50,00, R$ 20,00, R$ 10,00 R$ 5,00 R$ 2,00. The rest (Value that cannot be returned with available ballots) must be printed if it exists.

The code:

var saque = 22;
var contador100 = 0;
var contador50 = 0;
var contador20 = 0;
var contador10 = 0;
var contador5 = 0;
var contador2 = 0;

if(saque != 0) {
if(saque >= 100) {
    contador100++;
    saque =- 100;
}

if(saque >= 50) {
    contador50++;
    saque =- 50;
}

if(saque >= 20) {
    contador20++;
    saque =- 20;
}

if(saque >= 10) {
    contador10++;
    saque =- 10;
}

if(saque >= 5) {
    contador5++;
    saque =- 5;
}

if(saque >= 2) {
    contador2++;
    saque =- 2;
}
}

console.log("A quantidade de notas 100 é: " + contador100);
console.log("A quantidade de notas 50 é: " + contador50);
console.log("A quantidade de notas 20 é: " + contador20);
console.log("A quantidade de notas 10 é: " + contador10);
console.log("A quantidade de notas 5 é: " + contador5);
console.log("A quantidade de notas 2 é: " + contador2);

But for some reason, this code only considers the first note, for example, in the booty of 22 real, he will present me only a note of 20 and disregard the 2 real.

  • The question would be how to use the method recursively?

  • It would be like making this issue of withdrawing with the lowest possible grades and implementing in the recursive method.

  • @merchant I changed the code, but for some reason I still can’t make it work 100%.

  • I used your code and fixed it so you’d understand the flaws in it and not harm your learning.

3 answers

5

I decided to post a solution, which in my view is closer to what is being asked:

First you need to understand what recursion is, it’s outside the scope of this answer, but you can get more information at recursiveness and a little right here in Sopt on that other issue.

This put, for your exercise, would be something like this:

<body onload="notaQtd(not,ent)">
<script>
function notaQtd(notas,entrada)
{   for(var i = 0; i < notas.length; i++)
    {   if(entrada >= notas[i])
        {   var notaM = notas[i];
        }
    }
    var numN = entrada / notaM;
    console.log(Math.floor(numN) + " notas de : " + notaM);
    resto = parseFloat(entrada % notaM);
    if((resto != 0) && (resto > 1))
    {   notaQtd(notas,resto);
    }else if(resto != 0)
    {   console.log("Sobrou :" + resto);
    }
}
var not = [2,5,10,20,50,100];
var ent  = prompt("Digite o valor do saque(apenas números inteiros sem pontos):\nNotas disponíveis(100,50,20,10,5,2)");
</script>
</body>

3

In Grandpa’s time we used to do this:

var valor  = prompt("Valor do saque(apenas números inteiros sem pontos)");

var qtd100 = parseInt(valor/100);
console.log("notas de 100: " + qtd100);

var resto = (valor-(qtd100*100));
var qtd50 = parseInt(resto/50);
console.log("notas de 50: " + qtd50);

resto = (valor-((qtd100*100)+(qtd50*50)));
var qtd20 = parseInt(resto/20);
console.log("notas de 20: " + qtd20);

resto = (valor-((qtd100*100)+(qtd50*50)+(qtd20*20)));
var qtd10 = parseInt(resto/10);
console.log("notas de 10: " + qtd10);

resto = (valor-((qtd100*100)+(qtd50*50)+(qtd20*20)+(qtd10*10)));
var qtd5 = parseInt(resto/5);
console.log("notas de 5: " + qtd5);

resto = (valor-((qtd100*100)+(qtd50*50)+(qtd20*20)+(qtd10*10)+(qtd5*5)));
var qtd2 = parseInt(resto/2);
console.log("notas de 2: " + qtd2);

resto = (valor-((qtd100*100)+(qtd50*50)+(qtd20*20)+(qtd10*10)+(qtd5*5)+(qtd2*2)));

if (resto==1){
console.log("restou: " + resto);
}

For learning effect in your script we have the following fixes:

Inversion in saque =- for saque -= across all lines

For example: saque =-20; returns -20

equal sign (=) is assignment. draw=-20; assigns value (-20) to the serve variable

and saque -= 20; returns 2

Subtraction allocation operator (-=)

Expressions and operators

Loop for or while to achieve the objective satisfactorily because ifs no recursiveness and values above 187, does not work. Ties and iterations

1 - Loop of repetition for

//somente para teste ficar dinamico
var saque = entrada  = prompt("Valor do saque(apenas números inteiros sem pontos)");

//var saque = entrada =  266;
var contador100 = 0;
var contador50 = 0;
var contador20 = 0;
var contador10 = 0;
var contador5 = 0;
var contador2 = 0;


if(saque != 0) {
for(;saque >= 100;) {
    contador100++;
    saque -= 100;
}
for(;saque >= 50;) {
    contador50++;
    saque -= 50;
}

for(;saque >= 20;) {
    contador20++;
    saque -= 20;
}

for(;saque >= 10;) {
    contador10++;
    saque -= 10;
}

for(;saque >= 5;) {
    contador5++;
    saque -= 5;
}

for(;saque >= 2;) {
    contador2++;
    saque -= 2;
}

}
var total = (contador100*100+contador50*50+contador20*20+contador10*10+contador5*5+contador2*2);
var resto = entrada - total;

console.log("A quantidade de notas 100 é: " + contador100);
console.log("A quantidade de notas 50 é: " + contador50);
console.log("A quantidade de notas 20 é: " + contador20);
console.log("A quantidade de notas 10 é: " + contador10);
console.log("A quantidade de notas 5 é: " + contador5);
console.log("A quantidade de notas 2 é: " + contador2);
if (resto!=0){
console.log("O resto é: " + resto);
}

2 - Loop while repetition

var saque = entrada  = prompt("Valor do saque(apenas números inteiros sem pontos)");

var contador100 = 0;
var contador50 = 0;
var contador20 = 0;
var contador10 = 0;
var contador5 = 0;
var contador2 = 0;


if(saque != 0) {
while (saque >= 100) {
    contador100++;
    saque -= 100;
}
while (saque >= 50) {
    contador50++;
    saque -= 50;
}

while (saque >= 20) {
    contador20++;
    saque -= 20;
}

while (saque >= 10) {
    contador10++;
    saque -= 10;
}

while (saque >= 10) {
    contador5++;
    saque -= 5;
}

while (saque >= 2) {
    contador2++;
    saque -= 2;
}

}
var total = (contador100*100+contador50*50+contador20*20+contador10*10+contador5*5+contador2*2);
var resto = entrada - total;

console.log("A quantidade de notas 100 é: " + contador100);
console.log("A quantidade de notas 50 é: " + contador50);
console.log("A quantidade de notas 20 é: " + contador20);
console.log("A quantidade de notas 10 é: " + contador10);
console.log("A quantidade de notas 5 é: " + contador5);
console.log("A quantidade de notas 2 é: " + contador2);
if (resto!=0){
console.log("O resto é: " + resto);
}

  • That’s right, thank you very much! Can you explain to me the difference between =- and -=?

2


Just divide by the largest ballot and decrease, it follows the same idea of the answer of @Magichat.

var notasDisponiveis = [100, 50, 20, 10, 5, 2];

function calcularNotasNecessarias(valor, tentativa, resultado) {

  if (notasDisponiveis[tentativa] === undefined) {
    resultado.resto = valor;
    return resultado;
  }

  divisao = Math.floor(valor / notasDisponiveis[tentativa]);

  if (divisao > 0) {
    valor -= divisao * notasDisponiveis[tentativa];
    resultado.notas[notasDisponiveis[tentativa]] = divisao;
  }

  return calcularNotasNecessarias(valor, ++tentativa, resultado);
}
<input onkeyup="console.log(calcularNotasNecessarias(this.value, 0, {resto: 0, notas: {}}))">

The idea is pretty simple, assuming it’s 99, you’ll have:

 99/100 = 0.99 -> (Arredonda para baixo) -> 0
 99/50  = 1.98 -> (Arredonda para baixo) -> 1, indica que precisa de 1 nota de 50.
 49/20  = 2.45 -> (Arredonda para baixo) -> 2, indica que precisa de 2 notas de 20.
  9/10  = 0.90 -> (Arredonda para baixo) -> 0
  9/5   = 1.80 -> (Arredonda para baixo) -> 1, indica que precisa de 1 nota de 5.
  4/2   = 2.00 -> (Arredonda para baixo) -> 2, indica que precisa de 2 notas de 2.
Resto: 0

That’s exactly what he does.

  • It was in the logic of this division that I wasn’t getting there, thank you !

Browser other questions tagged

You are not signed in. Login or sign up in order to post.