素数回文

Problem Description
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);
 
Input
这里有许多组数据,每组包括两组数据a跟b。
 
Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
 
Sample Input
5 500
 
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383
 
分析:除了11外,任意偶数长度的回文都不是素数因为都会被11整除。题目给的范围里最大的回文素数就是9999999。所以数组只要开到这个数就够了,减少了很多数的筛选与数组的空间。
 
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 
 5 #define N 10000000   //9999999是题目要求范围的最大回文数
 6 char flag[N];
 7 
 8 int palindrome_number(int number);
 9 
10 int main(){
11     int i;
12     int j;
13     int a;
14     int b;
15 
16     memset(flag,'0',N);
17     flag[0]='1';
18     flag[1]='1';
19 
20     for(i=2;i<=sqrt((double)N);i++){
21         if(flag[i]=='0'){
22             for(j=i*i;j<N;j+=i)
23                 flag[j]='1';
24         }
25     }
26 
27     while(scanf("%d%d",&a,&b)!=EOF){
28         for(i=a;i<=b;i++){
29             if(i>N-1)
30                 continue;
31 
32             if(palindrome_number(i)==1 && flag[i]=='0')
33                 printf("%d\n",i);
34         }
35 
36         printf("\n");
37     }
38 
39     return 0;
40 }
41 
42 int palindrome_number(int number){
43     int array[9];
44     int i;
45     int length;
46     int flag;
47 
48     i=0;
49     while(number){
50         array[i]=number%10;
51         i++;
52         number/=10;    
53     }
54     length=i;
55 
56     flag=0;
57     for(i=0;i<length/2;i++){
58         if(array[i]!=array[length-i-1]){
59             flag=1;
60             break;
61         }
62     }
63 
64     if(flag==1)
65         return 0;
66 
67     else
68         return 1;
69 }

 

posted @ 2014-11-09 14:47  zqxLonely  阅读(663)  评论(0编辑  收藏  举报