解题思路:本题没有多大难度,跟着题目思路走,很轻松就能过。
具体看代码注释,应该没有难懂的地方。
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;
}