XTU-OJ 1295-Flawless Prime

题目描述

如果一个素数,依次去掉最高位得到一个数,这个数无前导0,并仍是素数的话,我们称其为“无瑕素数”。
比如317是素数,去掉最高位3得到17仍然是素数,再去掉最高位1得到7,仍然是素数,所以317是“无瑕素数”。
比如虽然107是素数,去掉最高位1得到7也是素数,但是因为存在前导0,所以这不是无瑕素数。
请写一个程序,判断某个素数是不是无瑕的。

输入

第一行是一个整数K,表示样例的个数。 以后每行一个整数n(2≤n≤1,000,000,000)。

输出

如果是无瑕素数,输出“Yes”,否则输出“No”。

样例输入

3
3
107
317

样例输出

Yes
No
Yes

解题思路:本题没有多大难度,跟着题目思路走,很轻松就能过。

具体看代码注释,应该没有难懂的地方。

AC代码: 

#include 

int k,n,cnt;
int nut[12];
bool flag1,flag2;

bool isPrime(int num)
{
    if (num == 1)   return false;
    for (int i = 2; i*i <= num; i ++)
        if ( num%i == 0)
            return false;
    return true;
}

bool exam(int np)
{
    int s,t;
    cnt = s = 1;
    while ( np )       // 题目是逐个去掉最高位,这里是从个位数开始复原(逆过程),简单一点
    {
        t = np%10;
        if (t == 0)
            return false;
        nut[cnt] = t*s+nut[cnt-1];
        cnt ++;
        s *= 10, np /= 10;
    }
    return true;
}
int main()
{
    scanf("%d",&k);
    while ( k --)
    {
        scanf("%d",&n);
        //  先用两个判断解决掉绝大部分数字
        if ( n == 2 || n == 3 || n == 5 || n == 7)  {puts("Yes");continue;}
        if ( n%2==0 || n%3==0 || n%5==0 || n%7==0)  {puts("No");continue;}
        //  检查数字n中,是否含有0,同时把n逐个拆解
        flag1 = exam(n);
        if (flag1)
        {
            for (int i = 1; i < cnt; i ++)
            {
                // 检查 n及 其依次去掉高位的数 是否都是素数
                flag2 = isPrime(nut[i]);
                if (!flag2)
                    break;
            }
            if (flag2)  puts("Yes");
            else        puts("No");
        }
        else    puts("No");
    }
    return 0;
}

你可能感兴趣的:(湘大OJ练习解析,算法,数据结构)