Jquery: calculate number of ballots of the service value (deliver as few numbers as possible)

4

I am solving an exercise that I am having doubts, it is referring to a bank system, in which when presenting the value of draw, I must receive the smallest number of possible notes for the indicated value, I must also use the recursive method. Here's what I've done so far:

Question: Serving system - Earn R $ 80,00; - Cash returned 1 note R $ 50.00; - Cash returned 1 note R $ 20.00; - Cash return 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 can not be returned with available banknotes) should 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 considers only the first note, for example, in the draw of 22 reais, it will only present me a note of 20 and disregard the 2 reals.

    
asked by anonymous 25.06.2017 / 00:12

3 answers

2

Just as you divide by the largest ballot and decrease, this follows the same idea as the answer from @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 very simple, assuming it is 99, you will 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 it does.

    
26.06.2017 / 05:26
5

I decided to post a solution, which in my opinion is closer to what is being requested:

First you need to understand what recursion is, it is beyond the scope of this answer, but you can get more information at recursion and here in SOpt in this another issue .

This, 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>
    
25.06.2017 / 17:51
3

In grandpa's time we did like 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 purposes in your script we have the following fixes:

Reversal% by% by% by% by all lines

For example: saque =- returns -20

  

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

and saque -= returns 2

  

Subtraction Assignment Operator (- =)

     

Expressions and operators

Use loop saque =-20; or saque -= 20; so that the goal is reached satisfactorily because with for there is no recursion and values above 187, it does not work. Ties and iterations

1 - Repeat loop 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 - Repeating loop while

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);
}
    
25.06.2017 / 02:58