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