Como Apresentar o Maior e Menor Numero!

27 respostas
J

Seguinte to elaborando um programinha que ele aprensenta o menor e maior numero mais como posos fazer isso?quero que ele automaticamente defina pensei em fazer uma ordenação do menor para o maior mais não consegui representa apenas o menor e maior

==================================>>>>>>>>>>>>>>>

Codigo Duvida

<<<<<<<<<<<<<<<<=================================

class Maior e Menor{

public static void main (String [] args){
int numero =  15;

int numero2 = 26;

int numero3 = 12;

int numero4 = 10;

int numero5 = 55;
}

}

==============================================>>

Fim do Codigo

<<=============================================

27 Respostas

T

Você pode usar arrays?

J

Com arrays eu sei fazer xD só dessa forna sem arrays que eu naum cosigo fazer =/… pq nunca me deparei com uam dessas comparar variavel por variavel e apresentar maior e menor! se pode ajudar ae vei agradeço fiko grato ou poder me daruma dica de como fazer jah ajuda abraço!

T

Amigo, sem arrays você pode fazer como se fosse uma tabelinha de futebol. Vai ficar um programa meio grande, mas é um exercício (trabalhoso mas é um exercício).

Em vez de "numero", "numero2" etc. use "vasco", "flamengo", "corinthians", "palmeiras", "remo" ou os times de sua preferência , e faça os jogos, como se fosse um tipo de "mata-mata". Se vasco &gt flamengo, então vasco ganhou, então você procede ao próximo par de times (corinthians x palmeiras)

Entendeu direitinho?

J

Ah entendi tip comparar um a um ate chegara uma final e tals pensei nisso mais sei lah pensie ke tinha uma forma ke jah comparava todos e apresentava mais ok valeu agradeço mesmo xD

J

Usei Array mesmo xD

import java.util.Arrays;
class Pag59a{

public static void main(String[]args){

	String retorno;
		
  int[] listanumeros = new int[5];
            listanumeros[0]=15;
	listanumeros[1]=30;
	listanumeros[2]=50;
	listanumeros[3]=05;
	listanumeros[4]=03;
System.out.println(Numeros Ordenados);

System.out.println("");

Arrays.sort(listanumeros);

System.out.print(Resultado===>>);

for(int i=0; i<listanumeros.length; i++){

System.out.print(listanumeros[i]+",");

}
}

}

ricardosoares

Acho que o que vc precisa é isso:

int menor = Integer.MAX_VALUE;
int maior = Integer.MIN_VALUE;
int[] listanumeros = new int[5];
listanumeros[0]=15;
listanumeros[1]=30;
listanumeros[2]=50;
listanumeros[3]=05;
listanumeros[4]=03;
for(int i=0; i<listanumeros.length; i++){
  if (listanumeros[i]><menor) menor = listanumeros[i];
  if (listanumeros[i]><maior) maior = listanumeros[i];
} 
System.out.print("Maior = ");
System.out.println(maior);
System.out.print("Menor = ");
System.out.println(menor);

mostra apenas o maior e o menor

T

É claro que existe “Collections.max” e “Collections.min”, mas o professor do cara não vai aceitar isso - ele quer uma solução como a do Ricardo.

Paulo_Silveira

O codigo do ricardo esta perfeito. Nao precisa ordenar!! Mas ainda da pra melhorar.

Ele faz praticamente 2*n comparacoes… da pra fazer com uma quantidade menor que isso de comparacoes. Quem se atreve?

T

Dá para fazer usando a tal tabela do campeonato e os mata-matas. (Fazendo desse jeito você precisa fazer algumas continhas, mas não é nada absurdo).

Dou a idéia para que o pessoal possa aprimorar.

davidbuzatto

Tentei implementar uma solução com maior performance mas não funcionou…

marciobarroso

Seria algo como N*logN ???

[]'s

Paulo_Silveira

Nao

É 3n/2. Beeeeeeem melhor que nlogn.

Alguem aqui tinha digitado um codigo e chegado perto… Bricando meia hora la na caelum pra lembrar como era isso…

marciobarroso

Paulo Silveira:
Nao

É 3n/2. Beeeeeeem melhor que nlogn.

Alguem aqui tinha digitado um codigo e chegado perto… Bricando meia hora la na caelum pra lembrar como era isso…

Eu cheguei a postar um código q eu fiz aqui, mas depois de analisar melhor, ví que ele não era tão bom qto o do Ricardo … por isso tirei :oops:

marciobarroso

Paulo …

Tentei, mas não conseguí … como seria possível implementar algo com complexidade 3N/2 ???

[]'s

mueller

Da pra alterar o código pra ficar assim, 3n/2 -1 comparações em média, n-1 no melhor caso e 2n -2 no pior (atenção: a pressa junto com o sono podem gerar conclusões erradas sobre o número de comparações :stuck_out_tongue: )

int menor = listanumeros[0];
int maior = listanumeros[0];
for (int i = 1; i < listanumeros.length; i++) {
	if (listanumeros[i] < menor) {
		menor = listanumeros[i];
	} else if (listanumeros[i] > maior) {
		maior = listanumeros[i];
	}
}
Paulo_Silveira

da pra fazer (3n/2)-2 no pior caso :slight_smile:
acho que é legal de blogar. nao encontrei referencias em portugues.

dreamspeaker

Paulo Silveira:
da pra fazer (3n/2)-2 no pior caso :slight_smile:
acho que é legal de blogar. nao encontrei referencias em portugues.

O Sr. poderia então fazê-lo logo, porque ontem fiquei uma hora da minha vida pensando no 3n/2 e não cheguei a lugar algum. :smiley:

davidbuzatto

Consegui diminuir o número de iterações pela metade, mas aumentou a quantidade de comparações, fazendo com que a performance não fosse melhorada.
Para a quantidade de elementos do array abaixo, eu tive que alocar 500mb para a máquina virtual, pois estava dando estouro de memória.
Fiz uma classe com métodos estáticos só para testar.

import java.util.*;

public class Main {
    
    public static void main( String[] args ) {
        
        int[] array = new int[ 100000000 ];
        int menorR;
        int menorD;
        
        populaArray( array );
        
        long inicio = System.currentTimeMillis();
        
        menorR = menorRapido( array );
        
        long meio = System.currentTimeMillis();
        
        menorD = menorDevagar( array );
        
        long fim = System.currentTimeMillis();
        
        System.out.println( "Utilizando metodo rapido\n" +
                "Menor = " + menorR + "\n" +
                "tempo gasto em milisegundos = " + ( meio - inicio ) );
        System.out.println( "Utilizando metodo denavagar\n" +
                "Menor = " + menorD + "\n" +
                "tempo gasto em milisegundos = " + ( fim - meio) );
        
    }
    
    
    public static int menorRapido( int[] array ) {
        
        int menor = array[array.length-1];
        
        for( int i = 1; i < array.length; i+=2) {
            
            if ( array[i-1] < array[i] && menor > array[i-1] )
                menor = array[i-1];
            else if ( menor > array[i] )
                menor = array[i];
            
        }
        
        return menor;
        
    }
    
    public static int menorDevagar( int[] array ) {
        
        int menor = array[0];
        
        for( int i = 1; i < array.length; i++) {
            
            if ( menor > array[i] )
                menor = array[i];
            
        }
        
        return menor;
        
    }
    
    public static void populaArray( int[] array ) {
        
        Random r = new Random();
        
        for ( int i = 0; i < array.length; i++ ) {
            
            array[i] = r.nextInt( 10000 );
            
        }
        
    }
    
}

Cheguei perto? :?:

ricardosoares

Certamente a solução “Collections” é a mais apropriada pro dia-a-dia. Deixa o código limpo e, tenho o palpite de que, internamente ela realiza as mesmas operações que eu apresentei.
Mas, como foi dito, creio que se trata de uma tarefa para curso. Lembro-me de ter feito esses exercícios na facul, em Pascal, a alguns 10 anos atrás. E o professor deve estar pedindo algo assim.

ricardosoares

Paulo Silveira:
O codigo do ricardo esta perfeito. Nao precisa ordenar!! Mas ainda da pra melhorar.

Ele faz praticamente 2*n comparacoes… da pra fazer com uma quantidade menor que isso de comparacoes. Quem se atreve?

Na verdade são 3 comparações por item. Tem também a comparação do “for”. hehehe

dreamspeaker

E o for conta como comparação? Não sei… bem, eu cheguei nisso aqui, comparando por pares:

int listanumeros[] = new int[5];
listanumeros[0]=15;
listanumeros[1]=30;
listanumeros[2]=50;
listanumeros[3]=05;
listanumeros[4]=03;
    	 
int maior = Integer.MIN_VALUE;
int menor = Integer.MAX_VALUE;
int lastMaior = listanumeros[0];
int lastMenor = Integer.MAX_VALUE;
    	
for (int i=0; i<listanumeros.length-1; i=i+2) {
	maior = listanumeros[i+1];
	menor = listanumeros[i];
	if (listanumeros[i] > listanumeros[i+1]) {
                maior = listanumeros[i];
                menor = listanumeros[i+1];
	}
   			
	if (maior > lastMaior) {
                lastMaior = maior;
	}
	if (menor < lastMenor) {
                lastMenor = menor;
	}
}
    	
if (listanumeros.length%2==1) {
	if (listanumeros[listanumeros.length-1]< lastMenor) {
                lastMenor = listanumeros[listanumeros.length-1];
	}
	else {
		if (listanumeros[listanumeros.length-1]> lastMaior) {
                       lastMaior = listanumeros[listanumeros.length-1];
		}
	}
}
    	
System.out.println("maior = " + lastMaior);
System.out.println("menor = " + lastMenor);
A

Galera aproveitando o tópico, como posso colocar uns 3 numero ou mais em ordem crescente ou decrescente ?
estou tentando fazer mais não consigo…alguem pode me explicar mais n em java faz em pseudo-código por favor.

peczenyj

marciobarroso:
Paulo …

Tentei, mas não conseguí … como seria possível implementar algo com complexidade 3N/2 ???

[]'s

Arvores Binárias?

ricardosoares

.

ricardosoares

E o for conta como comparação? Não sei…

for (int i=0;[color=red] i<listanumeros.length-1[/color]; i=i+2) {

No caso, faz a comparação a cada loop para determinar se realiza outro (loop) ou não.

T

Se você só quisesse determinar o valor máximo, a complexidade seria O(n) (ou seja, n comparações), porque você precisa varrer todos os elementos (já que eles estão em qualquer ordem), não dá para ser menor que isso.

O que o Paulo está dizendo é que é possível achar o máximo e o mínimo, em menos de 2 n comparações.

Em complexidade de algoritmos os índices dos loops normalmente não são levados em consideração, somente as operações “lentas” e “significativas” (que no caso é a comparação).

(Uma comparação de números de ponto flutuante é razoavelmente rápida, mas não uma de strings, se as strings forem arbitrariamente grandes. É por isso que em ordenação a operação de comparação é considerada “significativa”.

Paulo_Silveira

o codigo do dreamspeaker me parece correto

a sacada é fazer uma comparacao dois a dois, e depois so coparar o menor local com o menor global e a mesma coisas pro maior. da 3 comparacoes para cada par de numeros. 3n/2.

E -2 comparacoes por causa do primeiro par nao ter com quem comparar…

Criado 2 de julho de 2007
Ultima resposta 3 de jul. de 2007
Respostas 27
Participantes 10