Problem:
素数 II

素数というのは、1 よりも大きくそれ自身か 1 でしか割りきれない整数をいいます。例えば、2 は、2 と 1 でしか割り切れないので素数ですが、12 は、12 と 1 のほかに、2, 3, 4, 6 で割りきれる数なので素数ではありません。

整数 n を入力したとき、n より小さい素数のうち最も大きいものと、n より大きい素数のうち最も小さいものを出力するプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットに n (3 ≤ n ≤ 50,000) が１行に与えられます。

データセットの数は 50 を超えません。

Output

各データセットに対して、n より小さい素数のうち最大のものと、n より大きい素数のうち最小のものを１つのスペースで区切って１行に出力して下さい。

Sample Input

19
3517

Output for the Sample Input

17 23
3511 3527

Solution in JAVA (judge verdict: Accepted)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

final class Main {

    public static final int PMAX = 60000;

    private Main() {
    }

    public static void main(final String[] argv) throws IOException {
        final BufferedReader inputReader =
                new BufferedReader(new InputStreamReader(System.in));
        boolean[] prime = new boolean[PMAX];
        Arrays.fill(prime, true);
        prime[0] = false;
        prime[1] = false;
        for (int i = 2; i < PMAX; i++) {
            if (prime[i]) {
                for (int j = i * 2; j < PMAX; j += i) {
                    prime[j] = false;
                }
            }
        }
        while (true) {
            String input = inputReader.readLine();
            if (input == null) {
                break;
            }
            int index = Integer.parseInt(input);
            for (int i = index - 1; i >= 0; i--) {
                if (prime[i]) {
                    System.out.print(i + " ");
                    break;
                }
            }
            for (int i = index + 1; i < PMAX; i++) {
                if (prime[i]) {
                    System.out.println(i);
                    break;
                }
            }
        }
    }
}