题目大意是给两个整数a,b,然后求出这之间的所有回文素数。
枚举回文的数,其实枚举回文的数加上判断宿舍的时间不是很长的。
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <string.h>
5 #include <vector>
6 #include <math.h>
7 #include <time.h>
8 #include <queue>
9 #include <set>
10 using namespace std;
11
12 vector<int>ans;
13
14 int num[8];
15
16 bool check(int val)
17 {
18 for(int i = 2; i <= sqrt(val * 1.0); i++)
19 {
20 if(val % i == 0) return false;
21 }
22 return true;
23 }
24
25 void dfs(int i, int len)
26 {
27 if(i == len)
28 {
29 int val = 0;
30 for(int j = 0; j < 2 * len; j++)
31 {
32 if(j < len) val = val * 10 + num[j];
33 else val = val * 10 + num[2 * len - 1 - j];
34 }
35 if(check(val)) ans.push_back(val);
36 return;
37 }
38
39 if(i == 0)
40 {
41 for(int j = 1; j <= 9; j += 2)
42 {
43 //if(j == 5) continue;
44 num[i] = j;
45 dfs(i + 1, len);
46 }
47 }
48 else
49 {
50 for(int j = 0; j <= 9; j++)
51 {
52 num[i] = j;
53 dfs(i + 1, len);
54 }
55 }
56 }
57
58 void ddfs(int i, int len)
59 {
60 if(i == len)
61 {
62 int val = 0;
63 for(int j = 0; j < 2 * len - 1; j++)
64 {
65 if(j < len) val = val * 10 + num[j];
66 else val = val * 10 + num[2 * len - 2 - j];
67 }
68 if(check(val)) ans.push_back(val);
69 return;
70 }
71
72 if(i == 0)
73 {
74 for(int j = 1; j <= 9; j += 2)
75 {
76 //if(j == 5) continue;
77 num[i] = j;
78 ddfs(i + 1, len);
79 }
80 }
81 else
82 {
83 for(int j = 0; j <= 9; j++)
84 {
85 num[i] = j;
86 ddfs(i + 1, len);
87 }
88 }
89 }
90
91 void ready()
92 {
93 for(int i = 1; i <= 8; i++)
94 {
95 if(i % 2 == 0) dfs(0, i / 2);
96 else ddfs(0, i / 2 + 1);
97 }
98 }
99
100 int main()
101 {
102 freopen("pprime.in", "r", stdin);
103 freopen("pprime.out", "w", stdout);
104
105 ready();
106 sort(ans.begin(), ans.end());
107 int a, b, res = 0;
108 scanf("%d%d", &a, &b);
109 for(int i = 0; i < ans.size(); i++)
110 {
111 if(ans[i] >= a && ans[i] <= b) printf("%d\n", ans[i]);
112 }
113 }