每日一题之 hiho1768 真正的素数

描述
一个数 w 被称为真正的素数,当且仅当对于任何非负整数 x,y ( x + y < d ( w ) ) ,将十进制表示下的 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;
}

猜你喜欢

转载自blog.csdn.net/u014046022/article/details/80818822