Como reduzo esse código HELP

Galera, sou iniciante em java, fiz um programa pra pegar 3 int, e responder o maior número e o menor.
Usei o IF, e captei cada número em separado mas acho que dá pra reduzir esse código, alguma sugestão de um código melhor?
Dá pra captar os números todos de uma vez ? O IF é ideal pra esse caso ?
Obrigado !!


import java.util.Scanner;

public class Exercicios08 {
public static void main(String[] args) {

	Scanner entrada = new Scanner(System.in);


        // para pegar os 3 números separados
	System.out.println("Digite o primeiro número:");
	int numero1 = entrada.nextInt();
	System.out.println("Digite o segundo segundo:");
	int numero2 = entrada.nextInt();
	System.out.println("Digite o terceiro número:");
	int numero3 = entrada.nextInt();
	
	
	
	
	
	if (numero1 > numero2) { 
		if (numero1 > numero3); 
		System.out.println("O maior número é"+ numero1);
	}
	if (numero2 > numero3) { 
		 System.out.println("O maior número é"+ numero2);
	}
	
	if (numero3 > numero2) { 
		if (numero3 > numero1); 
		System.out.println("O maior número é"+ numero3);
	}
	
	//Para encontrar o menor número 
	if (numero1 < numero2) { 
		if (numero1 < numero3); 
		System.out.println("O menor número é"+ numero1);
	}
	if (numero2 < numero1) { 
		if (numero2 < numero3); 
		System.out.println("O menor número é"+ numero2);
	}
	
	if (numero3 < numero2) { 
		if (numero3 < numero1); 
		System.out.println("O menor número é"+ numero3);
	}
	
		
	
			

	entrada.close();

}

}

Seu raciocínio está quase certo, mas veja que faltaram os casos de números iguais. Matematicamente, vc têm essas situações:

n1 <= n2 <= n3
n1 <= n3 <= n2
n2 <= n1 <= n3
n2 <= n3 <= n1
n3 <= n1 <= n2
n3 <= n2 <= n1

Ou seja, para 3 números, 6 combinações de if's.
Basta agora traduzir a notação matemática acima para a linguagem de programação:

if ( n1 <= n2 && n2 <= n3 ) {
    // menor: n1
    // maior: n3
} else if ( n1 <= n3 && n3 <= n2 ) {
    // menor: n1
    // maior: n2
} // aqui vc continua

Agora pense, quantos if's seriam necessários para obter a mesma resposta para quatro números? Te respondo, 24 if's. E para cinco? 120 if's! E para seis? 720 if's!!!

Esse problema, abordado dessa forma, tem crescimento fatorial (O(n!)), o que é péssimo e inviável. Imagina saber quem é o maior e o menor elemento em um conjunto de mil números? E é aí quem entram os algoritmos de ordenação, que vão ordenar os valores de um array e, para algoritmos mais rápidos, você teria sua resposta em um tempo proporcional a uma função linear-logarítmica sobre a quantidade de números (O(n lg n)) - pesquise sobre Merge Sort, Quick Sort e Heap Sort. Para os mais lentos e viáveis para conjuntos de dados pequenos, algo proporcional à uma função quadrática (O(n^2)) - pesquise sobre Bubble Sort, Selection Sort e Insertion Sort. Um meio termo seria o Shell Sort, que executa um trabalho razoável em ambientes com escassez de recursos. Aí sim, você teria um código mais enxuto, que trataria todas as situações de forma uniforme. Da forma que está fazendo, que provavelmente é um exercício, vc não consegue escapar do “código extenso”.

Se forem só 3 números, não precisa complicar testando todas as possibilidades. Dá pra resolver com 3 if's:

// lê os números (pode ser com Scanner, como você fez)
int numero1 = ...;
int numero2 = ...;
int numero3 = ...;

int tmp;
// se numero1 for menor que numero3, troca os valores deles
if (numero1 < numero3) {
    tmp = numero1;
    numero1 = numero3;
    numero3 = tmp;
}
// aqui neste ponto eu tenho certeza que numero1 é maior ou igual a numero3

// se numero1 for menor que numero2, troca os valores deles
if (numero1 < numero2) {
    tmp = numero1;
    numero1 = numero2;
    numero2 = tmp;
}
// aqui neste ponto eu tenho certeza que numero1 é maior ou igual a numero2 e numero3
// mas ainda falta saber sobre numero2 e numero3, qual deles é maior

// se numero2 for menor que numero3, troca os valores deles
if (numero2 < numero3) {
    tmp = numero2;
    numero2 = numero3;
    numero3 = tmp;
}
// aqui neste ponto eu tenho certeza que numero1 é maior ou igual a numero2, que por sua vez é maior ou igual a numero3

System.out.println("O maior número é " + numero1 + " e o menor é " + numero3);

O primeiro if verifica se numero1 é menor que numero3, e caso seja, troca os valores deles (um passa a ter o valor do outro). Se numero1 for maior ou igual a numero3, não entra no if. Ou seja, depois deste if, eu tenho certeza que numero1 será maior ou igual a numero3.

Depois eu faço o mesmo com numero1 e numero2. Então depois do segundo if eu tenho certeza que numero1 é maior ou igual a numero2 e maior ou igual a numero3.

Mas eu ainda não sei se numero2 é maior que numero3, então eu uso o terceiro if para isso. Depois deste if (que usa a mesma lógica dos anteriores, de trocar os valores caso seja necessário), eu tenho certeza que numero2 é maior ou igual a numero3. E como os if's anteriores me garantiram que numero1 é maior ou igual a numero2 e a numero3, eu sei que o maior número é numero1 e o menor é numero3.


Se tiver mais números, aí não compensa fazer assim, e o melhor seria guardar os números em um array ou lista, e ordená-los:

Scanner entrada = new Scanner(System.in);
int quantidade = 10; // ler 10 números (mude conforme a necessidade)
int numeros[] = new int[quantidade]; // array que vai guardar os números
for (int i = 0; i < numeros.length; i++) {
    System.out.printf("Digite o %d° número:", i + 1);
    numeros[i] = entrada.nextInt();
}
// ordena o array
Arrays.sort(numeros);
// o maior número é o último do array, o menor é o primeiro
System.out.println("O maior número é " + numeros[numeros.length - 1] + " e o menor é " + numeros[0]);

Agora se você não precisasse guardar todos os números lidos e só quer saber o maior e menor, aí daria para ser assim:

Scanner entrada = new Scanner(System.in);
int quantidade = 10; // ler 10 números (mude conforme a necessidade)
int maior = Integer.MIN_VALUE, menor = Integer.MAX_VALUE;
for (int i = 0; i < quantidade; i++) {
    System.out.printf("Digite o %d° número:", i + 1);
    int n = entrada.nextInt();
    if (n > maior)
        maior = n;
    if (n < menor)
        menor = n;
}
System.out.println("O maior número é " + maior + " e o menor é " + menor);

Bom dia!

Veja se esta solução te ajuda:

Scanner scan = new Scanner(System.in);
    
    System.out.print("Quantos números deseja comparar? ");
    int vet[] = new int[scan.nextInt()];

    for (int cont = 0; cont < vet.length; cont++) {
        System.out.print("Digite o " + (cont + 1) + "º número: ");
        vet[cont] = scan.nextInt();
    }
    
    int maior = vet[0], menor = vet[0];

    for (int i = 0; i < vet.length; i++) {
        if (maior < vet[i]) {
            maior = vet[i];
        }
        
        if (menor > vet[i]) {
            menor = vet[i];
        }
    }
    System.out.println("O maior número digitado foi: " + maior);
    System.out.println("O menor número digitado foi: " + menor);
    
    scan.close();

Se você criar um método para retornar o menor entre 2 números e um para retornar o maior entre 2 números, fica bem simples, veja:

import java.io.PrintStream;
import java.util.Scanner;

public class Exercicios08 {

    private static final Scanner entrada = new Scanner(System.in);
    // se tem uma variável para a entrada, vamos manter a ortogonalidade e também ter uma variável pra saída
    private static final PrintStream saida = System.out;

    public static void main(String[] args) {
        saida.println("Digite o primeiro número:");
        int numero1 = Integer.parseInt(entrada.nextLine());

        saida.println("Digite o segundo segundo:");
        int numero2 = Integer.parseInt(entrada.nextLine());

        saida.println("Digite o terceiro número:");
        int numero3 = Integer.parseInt(entrada.nextLine());

        saida.println("O maior número é" + maior(numero1, maior(numero2, numero3)));
        saida.println("O menor número é" + menor(numero1, menor(numero2, numero3)));
    }

    // retorna o maior entre 2 numeros informados    
    private static int maior(int a, int b) { return a > b ? a : b; }

    // retorna o menor entre 2 numeros informados
    private static int menor(int a, int b) { return a < b ? a : b; }
}

Davi, muito obrigado!
A quantidade de conhecimento que eu tinha não dava pra usar Bubble Sort … Más já tô na pesquisa.

Depois posto com uma resolução baseada na tua dica.

1 curtida

Perfeito Hugo,

Vou tentar as duas soluções.

Obrigado!

PS.: Foi minha primeira dúvida aqui, a comunidade é incrível.

Boa tarde, Dambroski!

    Scanner scan = new Scanner(System.in);
    System.out.print("Quantos números deseja comparar? ");
    int vet[] = new int[scan.nextInt()]; // Aqui você está criando um vetor com a quantidade de nº que deseja comparar... 

    for (int cont = 0; cont < vet.length; cont++) {
        System.out.printf("Digite o %dº número: ", cont + 1);
        vet[cont] = scan.nextInt();
    }
    
    int maior = vet[0], menor = vet[0];

    for (int i = 0; i < vet.length; i++) {
        if (maior < vet[i]) {
            maior = vet[i];
        }
        if (menor > vet[i]) {
            menor = vet[i];
        }
    }
    System.out.println("O maior número digitado foi: " + maior);
    System.out.println("O menor número digitado foi: " + menor);  
    scan.close();

Com este algoritmo, você pode decidir quantos números deseja comparar.
Se você decidir comparar 5 por exemplo, você vai receber uma pergunta te pedindo a quantidade.

Em seguida, faço um for para percorrer o vetor e atribuir o maior e o menor valor as variáveis maior e menor.

Acho que seria o melhor algoritmo para este caso.

Abraço.

Este código está mais completo, caso o usuário digite num <= 1, não será possível fazer a comparação.
Neste caso é chamado o laço de repetição while até que o usuário digite dois ou mais números.

Caso o usuário deseje comparar dois números e digite dois números iguais, não existe maior nem menor, neste caso será mostrado o resultado System.out.println("Ambos os valores são iguais!");

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    System.out.print("Quantos números deseja comparar? ");
    int num = scan.nextInt();

    while (num <= 1) {
        System.out.println("Digite dois ou mais números para comparar...");
        System.out.print("Quantos números deseja comparar? ");
        num = scan.nextInt();
    }

    int vet[] = new int[num];

        for (int cont = 0; cont < vet.length; cont++) {
            System.out.printf("Digite o %dº número: ", cont + 1);
            vet[cont] = scan.nextInt();
        }

        int maior = vet[0], menor = vet[0];

        for (int i = 0; i < vet.length; i++) {
            if (maior < vet[i]) {
                maior = vet[i];
            }

            if (menor > vet[i]) {
                menor = vet[i];
            }
        }
        if (vet.length == 2) {
            if (maior == menor) {
                System.out.println("Ambos os valores são iguais!");
            } else {
                resultado(maior, menor);
            }
        } else {
            resultado(maior, menor);
        }
    scan.close();
}

public static void resultado(int maior, int menor) {
    System.out.println("O maior número digitado foi: " + maior);
    System.out.println("O menor número digitado foi: " + menor);
}

Achei perfeito esse código, e cumpre minhas limitações hahaha.
obrigado! :slight_smile:

1 curtida

Olá.
Sei que já teve uma solução que resolveu mas deixo minha colaboração com outra possivel solução.
Coloca em um arraylist de inteiros os numeros , organiza com a classe collections e pega o primeiro ou o último de acordo com o que precisa.Sem “IFS” e sem testes. Eu faria assim como abaxo:

public static void main(String[] args) {
	
Scanner entrada = new Scanner(System.in);
	ArrayList<Integer> numerosdigitados = new ArrayList<Integer>();

	// para pegar os 3 números separados
	System.out.println("Digite o primeiro número:");
	numerosdigitados.add(entrada.nextInt());
	System.out.println("Digite o segundo segundo:");
	numerosdigitados.add(entrada.nextInt());
	System.out.println("Digite o terceiro número:");
	numerosdigitados.add(entrada.nextInt());

	//Aqui você usa a Classe Collections e organiza o seu array em ordem crescente
	Collections.sort(numerosdigitados);
	// Primeira posição no indice 0 é seu menor numero
	System.out.println("O menor número é" + numerosdigitados.get(0));
	// Ultima posição no array ( para pegar o ultima indice do array é só voce pegar o tamanho do array e subtrair 1) é seu maior numero
	System.out.println("O maior número é" + numerosdigitados.get(numerosdigitados.size() - 1));

}