题目描述
如果一个素数,依次去掉最高位得到一个数,这个数无前导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 <stdio.h>
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;
}