Pessoal, bom dia! Eu venho fazendo vários exercícios do URI e já é o terceiro exercício que o URI acusa erro na leitura utilizando a classe Scanner. Veja:
Eu já desisti de resolver problema do URI com Java, sempre tenho problemas com I/O e tempo de execução. Minha sugestão ? Parta para C/C++ que o sofrimento é menor.
A minha resolução completa e que dá time limit exception está assim:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{intn=0;n=digitarNumero(1,1000);intl=0;intm2=0;intm3=0;intm4=0;intm5=0;for(inti=0;i<n;i++){l=digitarNumero(1,100);if((l%2)==0){m2++;}if((l%3)==0){m3++;}if((l%4)==0){m4++;}if((l%5)==0){m5++;}}System.out.println(m2+" Multiplo(s) de 2");System.out.println(m3+" Multiplo(s) de 3");System.out.println(m4+" Multiplo(s) de 4");System.out.println(m5+" Multiplo(s) de 5");}privatestaticintdigitarNumero(intmin,intmax)throwsNumberFormatException,IOException{InputStreamReaderis=newInputStreamReader(System.in);BufferedReaderir=newBufferedReader(is);intx=Integer.parseInt(ir.readLine());while((x<min)||(x>max)){x=Integer.parseInt(ir.readLine());}returnx;}}
staroski
Nunca tive problemas com isso, até algum tempo atrás, minha resolução de número primo era a mais rápida do site na linguagem Java.
Entretanto eu também implementei em C e C++ e aí a resolução em Java sumiu.
Aparentemente o URI apresenta a mais rápida, sem considerar a linguagem.
staroski
Esse deve ser o seu problema, você cria um novo reader para o System.in a cada chamada do método digitarNumero.
Deixa esse BufferedReader ir como constante estática da sua classe.
Frederico_Zanitti
Staroski, depois de definir a constante estática, apresentou esse erro:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassMain{privatefinalstaticInputStreamReaderis=newInputStreamReader(System.in);privatefinalstaticBufferedReaderir=newBufferedReader(is);publicstaticvoidmain(String[]args)throwsIOException{intn=0;n=digitarNumero(1,1000);intl=0;intm2=0;intm3=0;intm4=0;intm5=0;for(inti=0;i<n;i++){l=digitarNumero(1,100);if((l%2)==0){m2++;}if((l%3)==0){m3++;}if((l%4)==0){m4++;}if((l%5)==0){m5++;}}System.out.println(m2+" Multiplo(s) de 2");System.out.println(m3+" Multiplo(s) de 3");System.out.println(m4+" Multiplo(s) de 4");System.out.println(m5+" Multiplo(s) de 5");}privatestaticintdigitarNumero(intmin,intmax)throwsNumberFormatException,IOException{intx=Integer.parseInt(ir.readLine());while((x<min)||(x>max)){x=Integer.parseInt(ir.readLine());}returnx;}}
staroski
Outro problema é seu algoritmo, o enunciado diz que há duas linhas, a primeira linha contém a quantidade de números que há na segunda linha.
E o seu método digitarNumero tenta ler uma nova linha diversas vezes, veja:
for(inti=0; i < n; i++) {l=digitarNumero(1,100);
Eu tentaria assim:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintStream;publicclassMain{privatestaticfinalBufferedReaderIN=newBufferedReader(newInputStreamReader(System.in));privatestaticfinalPrintStreamOUT=System.out;publicstaticvoidmain(String[]args)throwsIOException{intn=lerNumero();int[]numeros=lerNumeros(n);intm2=0;intm3=0;intm4=0;intm5=0;for(intl:numeros){if((l%2)==0){m2++;}if((l%3)==0){m3++;}if((l%4)==0){m4++;}if((l%5)==0){m5++;}}OUT.println(m2+" Multiplo(s) de 2");OUT.println(m3+" Multiplo(s) de 3");OUT.println(m4+" Multiplo(s) de 4");OUT.println(m5+" Multiplo(s) de 5");}privatestaticintlerNumero()throwsIOException{Stringtexto=IN.readLine();returnInteger.parseInt(texto);}privatestaticint[]lerNumeros(intquantidade)throwsIOException{String[]textos=IN.readLine().split(" ");int[]numeros=newint[quantidade];for(inti=0;i<quantidade;i++){numeros[i]=Integer.parseInt(textos[i]);}returnnumeros;}}