Exercício Básico - Algoritmo em Java para cédulas necessárias a um certo valor

Olá gente, sou iniciante em programação e estou com um exercício na minha frente:

Escreva um algoritmo que leia um valor a ser sacado em um caixa eletrônico. Após a leitura, o algoritmo
deverá retornar a quantidade de cada cédula de R$50, R$20, R$10, R$5 e R$2 necessárias para compor o
referido valor.

Meu código é esse até o momento:

package exerciciosrevisão;

import java.util.Scanner;

public class num8CaixaEletronico {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n50 = 0, n20 = 0, n10 = 0, n5 = 0, n2 = 0;

    System.out.println("Caixa Eletrônico: \n");

    System.out.println("Quanto dinheiro você quer sacar:");
    int dinheiro = sc.nextInt();

    while (dinheiro != 0) {
        if (dinheiro >= 50) {
            n50 = dinheiro / 50;
            dinheiro = dinheiro % 50;
        } else if (dinheiro >= 20) {
            n20 = dinheiro / 20;
            dinheiro = dinheiro % 20;
        } else if (dinheiro >= 10) {
            n10 = dinheiro / 10;
            dinheiro = dinheiro % 10;
        } else if (dinheiro >= 5) {
            n5 = dinheiro / 5;
            dinheiro = dinheiro % 5;
        } else if (dinheiro >= 2) {
            n2 = dinheiro / 2;
            dinheiro = dinheiro % 2;
        }
    }
    System.out.println(n50 + " notas de R$50");
    System.out.println(n20 + " notas de R$20");
    System.out.println(n10 + " notas de R$10");
    System.out.println(n5 + " notas de R$5");
    System.out.println(n2 + " notas de R$2");
}

}

Porém o problema está em valores como o 101 que ao fazer o calculo ele calcula como 2 notas de 50 e sobra 1, não sei como posso fazer para o programa identificar isso e mudar, alguém pode me ajudar?

1 curtida

Você pode colocar um break no final do if. Exemplo:

if (dinheiro == 1) {
    break;
}

Porém você literalmente está perdendo dinheiro. Aconselho a criar uma nova variável chamada n1 e colocar ela pra receber resultados como esse. Você pode fazer isso assim:

if (dinheiro == 1) {
    n1 = dinheiro;
    break;
}

Os únicos valores impossiveis de levantar são 1 e 3 - nestes casos eu devolveria um erro e não faria calculo nenhum.

Todos os restantes valores são possíveis. Não podes é ter um algoritmo tão simples. Nunca podes dar a nota mais alta disponivel se, após entregar a nota, sobrar 1.

Para o caso especifico do 101, quando “entregas” a primeira nota, sobram 51, tudo bem. Mas se entregares outra de 50 fica a faltar 1, e nesse caso não podes, tens de saltar para o if seguinte.

if (dinheiro == 50 || dinheiro > 51) {
    n50 = dinheiro / 50;
    dinheiro = dinheiro % 50;
}
(...)

Pode Acrescentar um while para verificar se o valor é divisível pelas notas disponíveis.

while (dinheiro % 2 == 1){
System.out.println(“Valor invalido! Notas Disponiveis (50,20,10,5,2)”);
dinheiro = sc.nextInt();
}