描述
一个数 w 被称为真正的素数,当且仅当对于任何非负整数 x,y
,将十进制表示下的 w 的前 x 位和后 y 位去掉后它仍然是个素数。其中 d(w) 表示 w 在十进制表示下的位数。
例如 37 就是真正的素数,因为 3 , 7,37 都是素数。
而 13 不是真正的素数,因为 1 不是素数。
给定 n ,求第 n 小的真正的素数
输入
一个正整数 n
1 ≤ n ≤ 103
输出
输出第 n 小的真正的素数,如果不存在第 n 小的真正素数的话输出 -1.
样例输入
6
样例输出
37
思路:
打表!!!!只存在10以内的答案,超过10输出-1
#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
#include <vector>
using namespace std;
const int maxn = 1e6*10;
int is_prime[maxn];
int prime[maxn];
int res[1005];
bool judge(int x)
{
if (is_prime[x] == 0) return false;
bool flag = true;
while(x) {
int tmp = x%10;
if (is_prime[tmp] == 0 || is_prime[x] == 0) {
flag = false;
break;
}
x /= 10;
}
if (!flag) return false;
return true;
}
void init()
{
for (int i = 0; i <= maxn; ++i)
is_prime[i] = 1;
is_prime[0] = is_prime[1] = 0;
int cnt = 0;
for (int i = 2; i * i <= maxn; ++i) {
if (is_prime[i] == 1) {
prime[cnt++] = i;
for (int j = i*2; j <= maxn; j+=i) {
is_prime[j] = 0;
}
}
}
prime[0] = 2;
int t = 0;
for (int i = 0; i < cnt; ++i) {
if (judge(prime[i]) == true) {
res[t++] = prime[i];
}
}
}
int main()
{
init();
int n;
cin >> n;
if (n < 10)
cout << res[n-1] << endl;
else cout << "-1" << endl;
return 0;
}