Submissão no URI Online Judge

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;
    }
}