Time Limit: 1 second
Memory Limit: 2 MB
问题描述 有一个有趣的现象,有些数字(例如:2333)是个质数,将末尾的数去掉后发现它仍然是质数,依此类推,一直到第一位仍是质数。现在给定n和m的值,求在这个范围内所有的这种特殊质数和总个数。 (由于1的特殊性,这种特殊质数不包括小于20的质数,对等于1的情况不单独处理)
Input
输入只有两行,第一行一个整数n,第二行一个整数m。其中n和m都在一般整数范围内,并>=20,且n<=m不一定成立
Output
输出有多行,每个符合条件的特殊质数占一行,按从小到大的顺序输出,最后一行是总个数。如果在该范围内没有符合条件的数,那么输出一个0,仅一行。
Sample Input
2223 2334
Sample Output
2333(换行) 1 【题解】
用一个bool型的函数,判断一下这个数字是否为质数,这个函数可以写成递归的形式,x为质数就再判断一下x/10是否为质数。最后出口是x== 0 ,即去掉所有的最后一位后都是质数。
【代码】
#include <cstdio> #include <cmath> int a,b,num = 0; void input_data() { scanf("%d",&a); scanf("%d",&b); if (a > b) //有说a 不一定小于b,则要判断一下 { int t = a;a = b;b = t; } } bool can(int x) //判断x是否为特殊质数的递归写法 { if (x == 0) return true; //如果x==0则为出口 返回true int m = sqrt(x); //获取根号x for (int i = 2;i <= m;i++) //判断这个数字是否为质数的方法 if ((x % i) == 0) return false; return can(x / 10); //递归 } void output_ans() { for (int i = a;i <= b;i++) if (can(i)) { num++; printf("%d ",i); } printf("%d",num); } int main() { input_data(); output_ans(); return 0; }