Java: RuntimeException при запуске на spoj.com

Ниже приведен вопрос для задачи генератора простых чисел (от spoj.com):

Питер хочет сгенерировать несколько простых чисел для своей криптосистемы. Помоги ему! Ваша задача состоит в том, чтобы сгенерировать все простые числа между двумя заданными числами!

Ввод:

Ввод начинается с количества t тестов в одной строке (t‹=10). В каждой из следующих t строк через пробел записаны два числа m и n (1 ‹= m ‹= n ‹= 1000000000, n-m‹=100000).

Вывод:

Для каждого теста выведите все простые числа p такие, что m ‹= p ‹= n, по одному числу в строке, тесты разделены пустой строкой.

Пример:

Вход:

2

1 10

3 5

Выход:

2

3

5

7


3

5 

Ниже приведен мой код для того же:

package competitivecoding;

import java.util.Scanner;

class problem2{
public static void main(String args[]){
    Scanner sc = new Scanner(System.in);
    Scanner st = new Scanner(System.in);        
    int t = sc.nextInt();   // inputs the "no." of lines that users want to enter
    int a,b, flag, count;
    String line[] = new String[t];
    String[] number=new String[2];

    for(int i=0; i<t; i++){
        line[i] =st.nextLine();
    }

    for(count=0; count<t; count++){
        number  = line[count].split(" ");

        a = Integer.parseInt(number[0]);
        b = Integer.parseInt(number[1]);

        for(int i=a; i<=b; i++){
            for(int j=2; j<=i; j++){
                if(i%j==0){
                    if(i==j)
                       System.out.println(i);
                    else break;
                }
            }
        }

        System.out.println();
    }
}
}   

Ошибка: код при отправке создает исключение RuntimeException на spoj.com, хотя в моей системе он отлично работает.


person Jainam Jhaveri    schedule 22.01.2015    source источник
comment
Какую ошибку вы получаете?   -  person Jens    schedule 22.01.2015
comment
Исключение в потоке main java.lang.NumberFormatException: для входной строки:   -  person Jainam Jhaveri    schedule 22.01.2015
comment
.... Это самоопределение прямо здесь .. Как вы думаете, из какого числа выскочит ?   -  person austin wernli    schedule 22.01.2015
comment
попробуйте \s+ или используйте trim() перед разделением   -  person kaetzacoatl    schedule 22.01.2015
comment
Должен ли я разместить полный код для справки?   -  person Jainam Jhaveri    schedule 22.01.2015
comment
Вы пробовали его отлаживать? Скорее всего, у вас есть пробел в конце одной из ваших строк.   -  person jordaniac89    schedule 22.01.2015
comment
я думаю, что строка [i] не сканировалась итеративно..   -  person Jainam Jhaveri    schedule 22.01.2015
comment
я объявил новый объект сканера для целых чисел, и это сработало!   -  person Jainam Jhaveri    schedule 23.01.2015


Ответы (4)


package abc;

import java.util.Scanner;

class problem2{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int a,b, flag, count;
        String line[] = new String[t];
        String[] number=new String[10];

        for(int i=0; i<t; i++){
            line[i] =sc.nextLine();
        }
        for(count=0; count<t; count++){
            number = line[count].split(" ");}
            a = Integer.parseInt(number[0]);
            b = Integer.parseInt(number[1]);

            for(int i=a; i<=b; i++){
                for(int j=2; j<=i; j++){
                    if(i%j==0){
                        if(i==j)
                           System.out.println(i);
                        else break;
                    }
                }   
        }
    }
}   

//попробуй это

person Dipshil Agrawal    schedule 22.01.2015
comment
то, что вы пытались сделать, это сохранить массив строк в другой без его правильного объявления. так что я сделал..... заранее объявил номер строкового массива. Хотя я взял 10 элементов, кажется, мне нужен только диапазон, поэтому вы можете взять 2 элемента в массиве строк, чтобы уменьшить пространство, занимаемое во время выполнения. - person Dipshil Agrawal; 22.01.2015
comment
у него та же проблема, о которой я упоминал в своем ответе. Первая строка представляет собой пустую строку, содержащую только символ '\n'. - person Gabriel Espinel; 22.01.2015

Всегда обрабатывать исключение, которое может быть вызвано (в идеале, любое исключительное поведение, от которого можно избавиться, в соответствии с документацией Oracle для исключений) и никогда не рассматривать пользовательский ввод как безопасный:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int t = 2;

try {
    /* for each line */
    for (int i = 0; i < t; i++) {
        /* read the line */
        String line = br.readLine();

        /* split the line */
        String[] numbers = line.split(" ");
        if (numbers.length != 2)
            throw new ArrayIndexOutOfBoundsException();

        /* parse values */
        int min = Integer.parseInt(numbers[0]);
        int max = Integer.parseInt(numbers[1]);

        /* do your check */
        __find_prime_numbers__
    }
}
catch (NumberFormatException ex) {
    /* notice the user -> input format isn't correct, for example: "1 m" */
}
catch (ArrayIndexOutOfBoundsException ex) {
    /* notice the user -> input format isn't correct, for example: "1 " or "1 2 3" */
}
person Giulio Biagini    schedule 22.01.2015
comment
Проглатывание исключений не обрабатывает их. Я бы предпочел, чтобы меня ударили по лицу трассировкой srack, чем проглотили бы исключение, как в вашем коде. Делать что-то с исключением. Зарегистрируйся хотя бы. Не глотай это. - person Roadrunner; 22.01.2015
comment
Если исключения вызваны пользовательским вводом, как в этом случае, лучше всего catch их catch и распечатать сообщение для пользователя. - person Giulio Biagini; 22.01.2015
comment
@Roadrunner - ArrayIndexOutOfBoundsException, брошенный мной, обрабатывается последним catch. Это потому, что если числа на входе больше 2 или только одно, распечатываемое сообщение в моем коде всегда одно и то же. Это не проглатывание исключений. Это просто способ заметить пользователя. - person Giulio Biagini; 22.01.2015

Меня устраивает. Распечатайте ошибку, чтобы у нас было больше информации. Вы также можете сделать Scanner.nextInt(). Такие вещи, как несколько пробелов и вкладок, могут привести к беспорядку.

person VigneshM    schedule 22.01.2015

Вы используете sc.nextInt() перед первым sc.nextLine()? потому что в этом случае у вас может быть символ '\n' в буфере после его использования. Поэтому, когда вы используете nextLine() в первый раз, вы фактически получаете символ '\n' вместо следующей строки. И когда вы пытаетесь проанализировать целое число, это не удается.

См. здесь Сканер пропускает nextLine() после использования next(), nextInt() или другого nextFoo() методы

Если это так, то решение простое. Просто запустите вызов sc.nextLine(), который ничего не делает, кроме как "съесть" этот символ из буфера.

person Gabriel Espinel    schedule 22.01.2015