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 C (judge verdict: Accepted)

#include <stdio.h>

#define PRIME_MAX 1000000
int getprimes(int list[], int top){
    int i, j;
    int index = 0;
    char tmp[PRIME_MAX];

    for(i=0;i<top;i++) {
        tmp[i] = 1;
    }
   
    tmp[0] = tmp[1] = 0;
    for(i=2;i<top;i++) {
        if(tmp[i] == 1) {
            /* 素数 */
            list[index] = i;
            index ++;
            for(j=2;j*i<top;j++) {
                tmp[j*i] = 0;
            }
        }
    }

    list[index] = -1;
    return index;
}

int main(void) {
    int i;
    int n;
    int size;
    int primes[100000];
    size = getprimes(primes, PRIME_MAX);
   
    while(scanf("%d\n", &n) == 1) {
        for(i=0;i<size;i++) {
        	if(primes[i] == n) {
            	printf("%d %d\n", primes[i-1], primes[i+1]);
            	break;
        	} else if(primes[i] > n) {
            	printf("%d %d\n", primes[i-1], primes[i]);
            	break;
            }
        }
    }
   
    return 0;
}