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:
public static int digitaNumero(int min, int max){
Scanner s = new Scanner(System.in);
int vlr = -1;
if ((vlr < min) || (vlr > max)) {
vlr = s.nextInt();
}
return vlr;
}
O URI está acusando erro na leitura “vlr = s.nextInt();”
Alguém sabe o que pode ser?
o método nextInt()
não consome a quebra de linha, aliás, o único método do Scanner
que consome a quebra de linha é o nextLine()
.
Então provavelmente seu problema está abortando por time out.
Já viu os exemplos do URI? https://www.urionlinejudge.com.br/judge/pt/faqs/about/examples
Sugiro ler a entrada de dados da mesma forma que nos exemplos.
Staroski, obrigado pela resposta!
Tentei fazer como o do exemplo do URI que você passou, porém agora ele passou a dar o erro de time limit exception.
Não deu erro na entrada, mas passou a apresentar este erro. O método alterado ficou assim:
public static int digitaNumero(int min, int max) throws Exception {
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
int vlr = -100;
vlr = Integer.parseInt(in.readLine());
if ((vlr < min) || (vlr > max)) {
vlr = Integer.parseInt(in.readLine());
}
return vlr;
}
Qual é o link do desafio?
Posta sua classe completa.
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.
O link do desafio é este:
2060 - Desafio de Bino
A minha resolução completa e que dá time limit exception está assim:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
int n = 0;
n = digitarNumero(1, 1000);
int l = 0;
int m2 = 0;
int m3 = 0;
int m4 = 0;
int m5 = 0;
for (int i = 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");
}
private static int digitarNumero(int min, int max) throws NumberFormatException, IOException {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader ir = new BufferedReader(is);
int x = Integer.parseInt(ir.readLine());
while ((x < min) || (x > max)) {
x = Integer.parseInt(ir.readLine());
}
return x;
}
}
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.
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.
Staroski, depois de definir a constante estática, apresentou esse erro:
Exception in thread "main" java.lang.NumberFormat:
at java.lang.NumberFormat:
atException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at Main.digitarNumero(Main.java:54)
at Main.main(Main.java:26)
Command exited with non-zero status (1)
O Código ficou assim:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private final static InputStreamReader is = new InputStreamReader(System.in);
private final static BufferedReader ir = new BufferedReader(is);
public static void main(String[] args) throws IOException {
int n = 0;
n = digitarNumero(1, 1000);
int l = 0;
int m2 = 0;
int m3 = 0;
int m4 = 0;
int m5 = 0;
for (int i = 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");
}
private static int digitarNumero(int min, int max) throws NumberFormatException, IOException {
int x = Integer.parseInt(ir.readLine());
while ((x < min) || (x > max)) {
x = Integer.parseInt(ir.readLine());
}
return x;
}
}
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 (int i = 0; i < n; i++) {
l = digitarNumero(1, 100);
Eu tentaria assim:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
public class Main {
private static final BufferedReader IN = new BufferedReader(new InputStreamReader(System.in));
private static final PrintStream OUT = System.out;
public static void main(String[] args) throws IOException {
int n = lerNumero();
int[] numeros = lerNumeros(n);
int m2 = 0;
int m3 = 0;
int m4 = 0;
int m5 = 0;
for (int l : 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");
}
private static int lerNumero() throws IOException {
String texto = IN.readLine();
return Integer.parseInt(texto);
}
private static int[] lerNumeros(int quantidade) throws IOException {
String[] textos = IN.readLine().split(" ");
int[] numeros = new int[quantidade];
for (int i = 0; i < quantidade; i++) {
numeros[i] = Integer.parseInt(textos[i]);
}
return numeros;
}
}