Não posso usar array! O que uso?

17 respostas
paulovc

Ajudem-me, pooor favor!!!!

Resumindo... o meu programa vai ter como saída, por exemplo:

2
4
2
4
6
6
8
8
8

Há: dois números 2, dois números 4, dois números 6 e três números 8.

Então, o número que mais se repete é o 8. Certo?

Preciso fazer essa contagem sem usar array... Como posso fazer galera?? Fazendo uma pequena gambiarra fiz isso...

VEJAM ENTRE OS COMENTARIOS ESCRITO: CHAVE DE OURO
class ap15{   
      public static void main(String[] args){   
             int i=1;   
             int c=0;   
             int il=0;   
             int tp=0;   
             int ant=0;   
             int sub=0;   
             //a   
             int apA=0;   
             int apAc=0;   
             int apB=0;   
             int apBc=0;   
             int apC=0;   
             int apCc=0;   
                
                
             while(Integer.parseInt(args[0])<1 || Integer.parseInt(args[0])>100){   
                                               System.out.println();   
                                               System.out.println("Número de casos deve ser maior que 0 e menor ou igual a 100");    
                                               System.exit(-1);                                    
             }   
             while(args.length%2!=1 || args.length<2){   
                                               System.out.println();   
                                               System.out.println("Use: java ap15 (numero de casos) (intervalo dos números)");   
                                               System.out.println();   
                                               System.out.println("Exemplo: java ap15 1 2 11");   
                                               System.out.println();   
                                               System.out.println("Exemplo: java ap15 2 2 11 2 5");   
                                               System.out.println();   
                                               System.out.println("Exemplo: java ap15 3 2 11 2 5 30 50");    
                                               System.exit(-1);                                    
             }   
             il=Integer.parseInt(args[0])*2+1;   
             System.out.println();   
             for(int l1=1;l1<=Integer.parseInt(args[0]);l1++){   
                     for(int l2=Integer.parseInt(args[i]);l2<=Integer.parseInt(args[i+1]);l2++){   
                             for(int l3=1;l3<=l2;l3++){   
                                     if(l2%l3==0){   
                                            c++;   
                                     }   
                             }    
                             if(c==2){    
                                      if(ant==0){   
                                                 ant=l2;   
                                      }   
                                      else {    
                                           sub = l2-ant;   
                                           //teste   
                                           System.out.println(l2+"-"+ant+" = "+sub);   
                                           //fimteste   
                                           ant=l2;   
                                              
                                           //chave de ouro   
                                           if((sub!=1)){   
                                                  if(apA==0){   
                                                       apA=sub;   
                                                       apAc+=1;   
                                                  }   
                                                  else {   
                                                       if(apA==sub){   
                                                            apAc+=1;   
                                                       }   
                                                       else if(apB==0 && apA!=sub){   
                                                            apB=sub;   
                                                            apBc+=1;   
                                                       }   
                                                       else if(apC==0 && apB!=sub){   
                                                            apC=sub;   
                                                            apCc+=1;   
                                                       }   
                                                       else if(apB==sub){   
                                                            apBc+=1;   
                                                       }   
                                                       else if(apC==sub){   
                                                            apCc+=1;   
                                                       }   
                                                  }   
                                           }   
                                           //fim chave de ouro   
                                      }   
                                      tp++;   
                             }       
                     c=0;    
                     }   
                     //teste   
                     System.out.println();   
                     System.out.println("apA: "+apA+" - c: "+apAc+" / apB: "+apB+" - c: "+apBc+" / apC: "+apC+" - c: "+apCc);   
                     System.out.println();   
                     //fimteste   
                     if(apAc>apBc && apAc>apCc && apAc!=1){   
                                 System.out.println("Campeao dos saltos: "+apA);   
                     }   
                     else if(apBc>apAc && apBc>apCc && apBc!=1){   
                                 System.out.println("Campeao dos saltos: "+apB);   
                     }   
                     else if(apCc>apAc && apCc>apBc && apCc!=1){   
                                 System.out.println("Campeao dos saltos: "+apC);   
                     }   
                     else {   
                          System.out.println("Nenhum campeao dos saltos ");   
                     }   
                     System.out.println();   
                     apA=0;   
                     apAc=0;   
                     apB=0;   
                     apBc=0;   
                     apC=0;   
                     apCc=0;   
                     ant=0;   
                     i=i+2;                                
             }        
        }   
}

Tá dando erro porque ele conta os três primeiro números com variáveis comuns e compara... mas se o quarto número repetir mais que os três anteriores? Então TÁ ERRADO!!!!

Ajudem poooooor favor! Desde já agradeço!

17 Respostas

rmendes08

Assim, o que o programa tem que fazer exatamente ? Porque seja lá o que for tá muito complicado, e tudo o que tá muito complicado provavelmente tá errado …

rmendes08

Outra coisa, o código que você escreveu somente você entende. Dê nomes mais explicativos para suas classes e variáveis ao invés de usar abreviações. Você também pode diminuiro o número de espaços nas identações, para facilitar a leitura. Ajude-nos a te ajudar;

tinorberto

Vc quer fazer um programa, dado uma entrada vc quer saber qual nº repetiu mais??

paulovc

Este é o exercício passado pelo meu professor… eu quis tentar resumir explicando do jeito que entendi… Desculpe-me se não consegui passar isso :frowning:

15) * O Professor Ma.L (Math Lover) adora tudo o que seja relacionado com números primos.
Relembra que um primo é um número positivo maior que um que só é divisível por si próprio e
por 1. Neste momento o professor está a trabalhar numa propriedade de um conjunto de primos
chamada o campeão dos saltos. Um número inteiro N é chamado de “O campeão dos saltos” se
for a diferença entre primos consecutivos que ocorra com maior freqüência.

Por exemplo, considera os números primos consecutivos 2 3 5 7 11. As diferenças entre estes
primos são 1 2 2 4. Logo, para este conjunto de primos, o campeão dos saltos é o 2, que ocorre
duas vezes.

O que o professor queria era saber o campeão dos saltos para um qualquer conjunto de números
primos. Será que podes ajudá-lo?

A tua tarefa é escrever um programa que, dado um limite inferior e superior, calcula o campeão
dos saltos de todos os números primos compreendidos nos limites (nota que os limites inferior e
superior fazem também parte do intervalo a considerar). Usando o vetor args[], elabore uma
classe para solução do problema.

a) O primeiro elemento deve ser o número de casos a serem considerados © (1 ≤ C ≤ 100).
b) Em seguida os limite superior e inferior do intervalo a ser considerado.
c) O único array permitido para solução do problema é args[].

Exemplo entrada : Java Csalto 3 2 11 2 5 30 50

Saída :
Campeao dos saltos: 2
Nenhum campeao dos saltos
Campeao dos saltos: 4

Uso muita abreviações mesmo… é um erro meu :frowning: Deixe o código para lá… Apenas me ajude no ponto que estou com dúvida, por favor!

Dentre: 2, 2, 4, 4, 6, 6, 8, 8, 8. Ver qual o número que mais se repete sem usar array… Ajudem-me, por favor!!

Antes eu tava usando três variáveis pra contar… então ela contava assim: há dois números 2, dois números 4 e dois números 6. Mas e o 8? Não posso colocar umas 15 variáveis pra ficar contando e fazendo um monte de if, hehehehe

Fico no aguardo

paulovc

Não é beeeeeem assim… mas não usando array pra resolver o problema SERVE!!!

venomtotal

comentário lançado por equívoco

rmendes08

Veja bem wellington, o campeão dos saltos não é a maior diferença, é a diferença que aparece com maior frequência. No exemplo que você fez é o número 2. Sinceramente, eu não consigo pensar em uma maneira de fazer a contagem sem usar array, Map ou algo do tipo. Talvez você tenha que contar com alguma propriedade dos números primos ou então o prof. viajou na maionese mesmo.

paulovc
wellington.nogueira:
Hmm... Não tenho certeza se vc entendeu o problema... Bem, a entrada é simples: Qtdde de casos a tratar: 3 1o. caso: 2-11 2o. caso 1-5 3o. caso 30-50

Em cada um dos casos, deve-se obter os primos e a diferença entre eles.
Exemplificando 1o. caso:
Primos identificados: 2-3-5-7-11
Saltos obtidos: 1-2-2-4

Saída: Campeão dos saltos: 4

1 Considerando essas informações, primeiramente deve-se identificar qual é a quantidade de casos: 3
2 Próximo passo é obter os argumentos "limite inferior" e "limite superior" (definindo o intervalo a ser testado).
3 Verifique o primeiro primo: De posse do mesmo, obtenha o segundo primo e subtraia um pelo outro e grave o valor do salto.
4 Obtenha o próximo primo: Subtraia o valor do novo salto pelo valor do salto já obtido. Se for negativo o novo salto é maior. então grave este.
5 Assim sucetivamente até atingir o limite superior.

6 Repita os passos até não haverem mais casos a serem testados.

Faço tudo isso como o senhor falou... mas chegando na parte de pegar o "campeao dos saltos" não consigo resolver direito pois NÃO posso usar array ao não ser o Args.

Veja o que eu consegui melhorar... mas tem coisa que da pau... testem, por favor!!

class ap{
      public static void main(String[] args){
             int i=1;
             int c=0;
             int il=0;
             int tp=0;
             int ant=0;
             int sub=0;
             //a
             int ban=0;
             int cont=0;
             int cont2=0;
             int ap=0;
             int apc=0;
             int ap2=0;
             int apc2=0;
             
             while(Integer.parseInt(args[0])<1 || Integer.parseInt(args[0])>100){
                                               System.out.println();
                                               System.out.println("Número de casos deve ser maior que 0 e menor ou igual a 100"); 
                                               System.exit(-1);                                 
             }
             while(args.length%2!=1 || args.length<2){
                                               System.out.println();
                                               System.out.println("Use: java ap15 (numero de casos) (intervalo dos números)");
                                               System.out.println();
                                               System.out.println("Exemplo: java ap 1 2 11");
                                               System.out.println();
                                               System.out.println("Exemplo: java ap 2 2 11 2 5");
                                               System.out.println();
                                               System.out.println("Exemplo: java ap 3 2 11 2 5 30 50"); 
                                               System.exit(-1);                                 
             }
             il=Integer.parseInt(args[0])*2+1;
             System.out.println();
             for(int l1=1;l1<=Integer.parseInt(args[0]);l1++){
                     for(int l2=Integer.parseInt(args[i]);l2<=Integer.parseInt(args[i+1]);l2++){
                             for(int l3=1;l3<=l2;l3++){
                                     if(l2%l3==0)
                                            c++;
                             } 
                             if(c==2){ 
                                      if(ant==0){
                                           ant=l2;
                                      }
                                      else { 
                                           sub = l2-ant;
                                           System.out.println(l2+"-"+ant+" = "+sub);
                                           ant=l2;
                                      }
                                      tp++;
                             }
                             c=0; 
                     }
                     //System.out.println("total primos: "+tp);
                     //System.out.println();
                 for(int a=0;a<=( (tp-1)*(tp-2) );a++){
                     ant=0; 
                     for(int l4=Integer.parseInt(args[i]);l4<=Integer.parseInt(args[i+1]);l4++){
                             for(int l5=1;l5<=l4;l5++){
                                     if(l4%l5==0)
                                            c++;
                             } 
                             if(c==2){
                                      if(ant==0){
                                           ant=l4;
                                      }
                                      else { 
                                           sub=l4-ant;
                                           //System.out.println(cont+"  -  "+l4+"-"+ant+" = "+sub);
                                           ant=l4;
                                           //System.out.println("BANIDO: "+ban +" = sub: "+sub);
                                           if(ban==0){
                                           if((ap==sub || (ap==0 && sub!=1)) && apc!=-1){
                                                ap=sub;
                                                apc++;
                                           }
                                           //(ban!=sub || ban==0))
                                           else if((ap2==sub || (ap2==0 && sub!=1)) && apc!=-1){
                                                ap2=sub;
                                                apc2++;
                                           }
                                           }
                                           else {
                                                if(sub!=ban && sub!=ap && sub!=1 && apc!=-1){
                                                     ap2=sub;
                                                     apc2++;
                                                }     
                                           }
                                      }
                                      if(cont==(tp-1)){
                                           //System.out.println("ap: "+ap+" - c: "+apc+" / ap2: "+ap2+" - c: "+apc2);
                                           //if(apc==tp){
                                           //       apc=-1;
                                           //}
                                           //System.out.println(apc+" + "+apc2+" = "+tp+" ??????????????");
                                           //if((apc+apc2)==(tp-1)){
                                           //     apc=-1;                   
                                           //}
                                           //System.out.println(cont2+" CONTS "+cont);
                                           if(apc2>apc){
                                                //System.out.println(apc2+" > "+apc+"= ?");
                                                ap=ap2;
                                                apc=0;
                                                ap2=0;
                                                apc2=0;
                                                cont=0;
                                           }
                                           else if(apc2==apc){
                                                      ap=ap2;
                                                      ban=ap2;
                                                      apc=0;
                                                      ap2=0;
                                                      apc2=0;
                                                      cont=0; 
                                           }
                                           cont2++;
                                      }
                                      cont++;
                             }
                             c=0;
                     }
                     cont=0;
                     cont2=0; 
                 }    
                     //System.out.println(">> ap: "+ap+" / tp: "+tp);
                     if( apc==1 || ((apc+apc2)==tp) ){
                               System.out.println("Nenhum campeao dos saltos");
                     }
                     else{
                               System.out.println("Campeao dos saltos: "+ap);
                     }
                     ap=0;
                     apc=0;
                     ap2=0;
                     apc2=0;
                     tp=0;
                     ant=0;
                     ban=0;
                     i=i+2;                             
             }     
        }
}

Testem com: java ap 1 20 38
java ap 1 100 200

Da erro bobo!!!!!!

2
4
2
4
6
6
6

ap = variável que vai armazenar o número que mais se repete
ap2 = auxiliar, mudará de valor o tempo todo

if(ap2>ap){ ap=ap2 } else { ap2 >>>>>> próximo número! }

O Problema que este próximo número precisa ser diferente dos já vistos.. queria numerar as linhas como

0 - 2
1 - 4
2 - 2
3 - 4
4 - 6
5 - 6
6 - 6

if(ap==ap2){
     >> teria que armazenar a partir da posição 3.
}

Mas não consigo banir esses números que já foram usados...

Alguém alguma idéia?

Sinceramente, este foi o único fórum no qual o pessoal teve a paciência de me responder.... Muito muito obrigado, galera!!

Mesmo estando no meu 1 bimestre de Java vou tentar repassar meus conhecimentos do 1 e 2 ano aqui.. ajudando o pessoal!!

Mais uma vez muito obrigado :D

rmendes08:
Veja bem wellington, o campeão dos saltos não é a maior diferença, é a diferença que aparece com maior frequência. No exemplo que você fez é o número 2. Sinceramente, eu não consigo pensar em uma maneira de fazer a contagem sem usar array, Map ou algo do tipo. Talvez você tenha que contar com alguma propriedade dos números primos ou então o prof. viajou na maionese mesmo.

Você tá certo, rmendes08. É o valor que mais se repete!

Também pensei que não teria como resolver se não usar array... opa Map? o que é isso? talvez seja isso que ele quer que eu use... Ou mandar os valores para outra class que irá receber pelo args e fazer a contagem.... Mas mesmo assim haveria a necessidade de outro array :cry:

Ele deve ter viajado na maionese mesmo =S

peczenyj

Um map [numero -> quantidade] parece ser o mais simples.

paulovc

Não entendi muito bem… como eu faria? Vou pesquisar sobre Map aqui

Desde já muito obrigado!

paulovc

wellington.nogueira:
O Map é realmente a melhor solução que encontrei para este caso, entretanto não sei se será permitido o uso de coleções para solucionar o problema.

Até conseguí, com uso de variáveis mas é muito limitado. A partir de um determinado limite superior, não funciona mais corretamente :frowning:

Para ter essa certeza, criei um Map para obter a resposta correta e validar o que tinha feito.

Um HashMap<Integer, Integer> onde o primeiro representa o Salto e o segundo representa a quantidade de repetições do mesmo.

Depois é varrer o HashMap em busca do maior valor.

Neste site diz http://rafaelbortolini.blogspot.com/2007/07/trabalhando-com-hashmap.html que só posso usar HashMap<Integer, String>

Dá certo HashMap<Integer, Integer>??? A Solução é ótima mesmo!!! Como posso testar? é como um vetor isso? Ainda não aprendi sobre isso tô meio confuso…

Mais uma vez Obrigado!

edufera10

Caro paulovc lendo o tópico há varias questões que mostram que você é iniciante em programação. Se o seu professor esta exigindo o NÃO uso e arrays com certeza ele tem o foco no algoritimo e não no código java, hash map e outras coleções seriam ótimos para resolver esse problemas mas se o foco do seu professor for mesmo o algoritimo qualquer solução que fuja de laços e tipos promitivos (exceto String) com certeza serão desbonificadas ou desconsideradas.
O professor esta testando sua lógica, sabia que a maioria dos melhores programadores da india são selecionados atraves de testes que envolvem algoritimos com números primos? da uma googlada ai pra ver

paulovc

edufera10:
Caro paulovc lendo o tópico há varias questões que mostram que você é iniciante em programação. Se o seu professor esta exigindo o NÃO uso e arrays com certeza ele tem o foco no algoritimo e não no código java, hash map e outras coleções seriam ótimos para resolver esse problemas mas se o foco do seu professor for mesmo o algoritimo qualquer solução que fuja de laços e tipos promitivos (exceto String) com certeza serão desbonificadas ou desconsideradas.
O professor esta testando sua lógica, sabia que a maioria dos melhores programadores da india são selecionados atraves de testes que envolvem algoritimos com números primos? da uma googlada ai pra ver

Desculpa a demora pra responder… tive que trabalhar até tarde! :frowning:

Não diga que sou iniciante… se não eu fico triste!!! tô no terceiro ano do meu técnico de informática industrial

Usando variáveis é muito limitado… mas consegui fazer e o professor testou e aceitou!!! Fiquei muito feliz!!

wellington.nogueira, valeu foi útil também!!

Obrigado à todos, todos, todos!!! Este fórum é DE MAIS!!!

WellingtonRamos

Hmm…
Não tenho certeza se vc entendeu o problema…
Bem, a entrada é simples:
Qtdde de casos a tratar: 3
1o. caso: 2-11
2o. caso 1-5
3o. caso 30-50

Em cada um dos casos, deve-se obter os primos e a diferença entre eles.
Exemplificando 1o. caso:
Primos identificados: 2-3-5-7-11
Saltos obtidos: 1-2-2-4

Saída: Campeão dos saltos: 4

1 Considerando essas informações, primeiramente deve-se identificar qual é a quantidade de casos: 3
2 Próximo passo é obter os argumentos “limite inferior” e “limite superior” (definindo o intervalo a ser testado).
3 Verifique o primeiro primo: De posse do mesmo, obtenha o segundo primo e subtraia um pelo outro e grave o valor do salto.
4 Obtenha o próximo primo: Subtraia o valor do novo salto pelo valor do salto já obtido. Se for negativo o novo salto é maior. então grave este.
5 Assim sucetivamente até atingir o limite superior.

6 Repita os passos até não haverem mais casos a serem testados.

WellingtonRamos

Opa, falha minha :oops:

WellingtonRamos

O Map é realmente a melhor solução que encontrei para este caso, entretanto não sei se será permitido o uso de coleções para solucionar o problema.

Até conseguí, com uso de variáveis mas é muito limitado. A partir de um determinado limite superior, não funciona mais corretamente :frowning:

Para ter essa certeza, criei um Map para obter a resposta correta e validar o que tinha feito.

Um HashMap<Integer, Integer> onde o primeiro representa o Salto e o segundo representa a quantidade de repetições do mesmo.

Depois é varrer o HashMap em busca do maior valor.

WellingtonRamos

http://java.sun.com/javase/6/docs/technotes/guides/collections/index.html
http://java.sun.com/javase/6/docs/technotes/guides/collections/reference.html
http://java.sun.com/docs/books/tutorial/collections/index.html

Esse blog está com informação meio estranha. Parece que falta informação…

Criado 11 de abril de 2010
Ultima resposta 12 de abr. de 2010
Respostas 17
Participantes 7