看面试经验的时候看见了这个问题,
首先名词解释:
回文数:就是一个数从前看和从后看是一样的,比如121,12321
质数:就是一个只能被1和它自身整除.
回文质数:就是又是回文数又是质数.
好的,概念解释完了,我们就写程序了.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 /** 5 判断m是否为质数 6 @return 1:质数,0:不是质数 7 **/ 8 int ss(int m){ 9 for(int i=2;i<=sqrt(m);i++) 10 if(! (m%i)) 11 return 0; 12 return 1; 13 } 14 15 /** 16 判断m是否为回文数 17 @return 1:回文,0:不是回文 18 **/ 19 int huiwen(int m){ 20 int x=0,y; 21 y=m; 22 while(y){ 23 x = x*10 + y % 10; 24 y /= 10; 25 } 26 if (m==x) 27 return 1; 28 else 29 return 0; 30 } 31 32 int main() 33 { 34 /** 35 回文质数的要求: 36 1 位数必须为奇数 37 2 回文数 + 质数 38 3 唯一例外:11 39 **/ 40 // 直接打印11 41 printf("回文质数:%d\r\n",11); 42 int j = 1; //基数 43 int k = 3; //边界 44 int l; 45 while (j < k){ 46 l = pow(100,j); 47 for (int i=l+1;i < 10 * l;i++,i++) 48 if(huiwen(i)&&ss(i)) 49 printf("回文质数:%d\r\n",i); 50 j++; 51 } 52 }
为什么要奇数位的回文数呢?因为偶数位的回文数注定会被11整除,所以肯定不是质数.
那么我们这里只需要考虑101-999,10001-99999,等等奇数位,所以可以少掉很多循环啦.