Description
牛客网 2018校招真题 双素数
Solving Ideas
欧拉线性筛法求素数
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wylu
*/
public class Main {
//元素值为false表示该元素下标值为素数
static boolean[] mark = eulerSieve(1000000);
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
int res = -1;
for (int i = 13, j = 0; j < k && i < mark.length; i += 2) {
if (!mark[i]) {
int ri = reverse(i);
if (ri != i && !mark[ri]) j++;
if (j == k) res = i;
}
}
System.out.println(res);
}
private static int reverse(int x) {
int s = 0;
while (x != 0) {
s = s * 10 + x % 10;
x /= 10;
}
return s;
}
//欧拉线性筛法 O(n)
private static boolean[] eulerSieve(int n) {
boolean[] mark = new boolean[n + 1];
int[] primes = new int[n / 2];
for (int i = 2, count = 0; i <= n; i++) {
if (!mark[i]) primes[count++] = i;
for (int j = 0; j < count && i * primes[j] <= n; j++) {
mark[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
return mark;
}
}