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