usaco1.52Prime Palindromes

dfs搜前5位数 根据前面的算后面的

View Code
  1 /*
  2  ID: your_id_here
  3  PROG: pprime
  4  LANG: C++
  5  */
  6 #include <iostream>
  7 #include<cstdio>
  8 #include<cstring>
  9 #include<cmath>
 10 #include<algorithm>
 11 using namespace std;
 12 int a,b,g;
 13 int kk[10000],f[20][20],tt,ff[100000];
 14 char s[20];
 15 int prime(int x)
 16 {
 17     int i,j,k,flag = 1;
 18     k = sqrt(x);
 19     for(i = 2 ; i <= k ; i++)
 20     {
 21         if(x%i==0)
 22         {
 23             flag = 0;
 24             break;
 25         }
 26     }
 27     return flag;
 28 }
 29 int palind(int k,char *ss)
 30 {
 31     int i,flag = 1;
 32     for(i = 1; i <= k ;i++)
 33     if(ss[i]!=ss[k-i+1])
 34     {
 35         flag = 0;
 36         break;
 37     }
 38     return flag;
 39 }
 40 void dfs(int v)
 41 {
 42     int i,y,s1 =0,s2 =0,s3 = 0,j;
 43     char str[20],str3[20];
 44     if(v>5)
 45     return ;
 46     for(i = 1; i <= v ; i++)
 47     str[i] = s[i];
 48     for(i = 1; i <= v ; i++)
 49     str3[i] = s[i];
 50     j = v;
 51     for(i = v+1 ; i <= 2*v ; i++)
 52     str[i] = s[j--];
 53     j = v-1;
 54     for(i = v+1 ; i < 2*v ; i++)
 55     str3[i] = s[j--];
 56     y = 1;
 57     for(i = v; i >= 1 ; i--)
 58     {
 59         s1+=y*(s[i]-'0');
 60         y = y*10;
 61     }
 62     y = 1;
 63     for(i = 2*v ; i >= 1 ; i--)
 64     {
 65         s2+=y*(str[i]-'0');
 66         y = y*10;
 67     }
 68     y = 1;
 69     for(i = 2*v-1 ; i >= 1 ; i--)
 70     {
 71         s3+=y*(str3[i]-'0');
 72         y = y*10;
 73     }
 74     if(s1>=a&&s1<=b)
 75     {
 76         if(palind(v,s)&&prime(s1))
 77         {
 78             if(s1<100000)
 79             {
 80                 if(!ff[s1])
 81                 {
 82                     g++;
 83                     kk[g] = s1;
 84                     ff[s1] = 1;
 85                 }
 86             }
 87             else
 88             {
 89                 g++;
 90                 kk[g] = s1;
 91             }
 92         }
 93     }
 94     if(s2>=a&&s2<=b)
 95     {
 96         if(palind(2*v,str)&&prime(s2))
 97         {
 98             if(s2<100000)
 99             {
100                 if(!ff[s2])
101                 {
102                     g++;
103                     kk[g] = s2;
104                     ff[s2] = 1;
105                 }
106             }
107             else
108             {
109 
110                 g++;
111                 kk[g] = s2;
112             }
113         }
114     }
115     if(s3>=a&&s3<=b)
116     {
117         if(palind(2*v-1,str3)&&prime(s3))
118         {
119 
120             if(s3<100000)
121             {
122                 if(!ff[s3])
123                 {
124                     g++;
125                     kk[g] = s3;
126                     ff[s3] = 1;
127                 }
128             }
129             else
130             {
131                 g++;
132                 kk[g] = s3;
133             }
134         }
135     }
136     if(s1>b)
137     return ;
138     for(i = 0 ; i <= 9 ; i++)
139     {
140         s[v+1] = i+'0';
141         dfs(v+1);
142     }
143 }
144 int main()
145 {
146     freopen("pprime.in","r",stdin);
147     freopen("pprime.out","w",stdout);
148     int i;
149     char num[20];
150     cin>>a>>b;
151     for(i = 1; i <= 9 ; i++)
152     {
153         s[1] = i+'0';
154         dfs(1);
155     }
156     sort(kk+1,kk+g+1);
157     for(i = 1; i <= g ; i++)
158     cout<<kk[i]<<endl;
159     fclose(stdin);
160     fclose(stdout);
161     return 0;
162 }
原文地址:https://www.cnblogs.com/shangyu/p/2772264.html