20211202

今天看到有人说20211202这一天很特殊,想起刚学编程那会求某一范围内的回文数。今天闲来无事,计算了一下本世纪的回文日期,发现只有12个,今天已经是第5个了。

实现思路,由于年份是回文,因此最后两位是月份,前两位是日期,为了分析方便,我们将年份的四位分别提取出来,从左到右依次为n1~n4,分析如下:

1、n4只能是0或1。因为月份只能是01、02...10、11、12,n4代表的是月份的第一个数字。

2、n4如果是0,则n3则是1~9,n4如果是1,则n3只能取0、1、2。n3代表的是月份的第二个数字。

3、n2只能是0、1、2、3。n2是0,则n1取1~9;n2是1或2,则n1取0~9;n2是3,n1取0或1。n2代表日期的第一个数字,n1代表日期的第二个数字。

4、二月份比较特殊,如果是2月,则第三步的“n2是3”无效(最多29天),同时,如果不是闰年,则第三步的“n1取0~8”(只有28天)。

具体代码如下:

#include <iostream>
#include<iomanip>
#include <unordered_map>
#include <vector>
using namespace std;

bool IsPalindromeDay(int year)
{
    int n1 = year % 10;//个位
    int n2 = (year / 10) % 10;//十位
    int n3 = (year / 100) % 10;//百位
    int n4 = year / 1000;//千位
    bool bry = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));//是否闰年

    unordered_map<int, vector<int>> gsMap = { 
        {0,{1,2,3,4,5,6,7,8,9}},
        {1,{0,1,2}} };

    unordered_map<int, vector<int>> bqMap= {
        {0,{1,2,3,4,5,6,7,8,9 }},
        {1,{0,1,2,3,4,5,6,7,8,9 }},
        {2,{0,1,2,3,4,5,6,7,8,9 }},
        {3,{0,1 }} };

    if ((n1 == 0) && (n2 == 2))
    {
        //如果是2月份,则日期不可能是30、31
        bqMap.erase(3);
        if (!bry)
        {//不是闰年,去掉2月29
            bqMap[n2].erase(bqMap[n2].begin() + bqMap[n2].size() - 1);
        }
    }

    return gsMap.find(n1) != gsMap.end() && (std::find(gsMap[n1].begin(), gsMap[n1].end(), n2) != gsMap[n1].end()) &&
        bqMap.find(n3) != bqMap.end() && (std::find(bqMap[n3].begin(), bqMap[n3].end(), n4) != bqMap[n3].end());
}

int main()
{
    int c = 0;

    for (int year = 1000; year <= 9999; ++year)
    {
        if (IsPalindromeDay(year))
        {
            int n1 = year % 10;//个位
            int n2 = (year / 10) % 10;//十位
            int n3 = (year / 100) % 10;//百位
            int n4 = year / 1000;//千位

            int month = n1 * 10 + n2;
            int day = n3 * 10 + n4;

            cout << setw(4) << setfill(' ') << ++c << " : " << year << "-" << setw(2) << setfill('0') << month << "-" << setw(2) << setfill('0') << day << endl;
        }
    }

    return 0;
}

具体年份:

001 : 1001-10-01
002 : 1010-01-01
003 : 1011-11-01
004 : 1020-02-01
005 : 1021-12-01
006 : 1030-03-01
007 : 1040-04-01
008 : 1050-05-01
009 : 1060-06-01
010 : 1070-07-01
011 : 1080-08-01
012 : 1090-09-01
013 : 1101-10-11
014 : 1110-01-11
015 : 1111-11-11
016 : 1120-02-11
017 : 1121-12-11
018 : 1130-03-11
019 : 1140-04-11
020 : 1150-05-11
021 : 1160-06-11
022 : 1170-07-11
023 : 1180-08-11
024 : 1190-09-11
025 : 1201-10-21
026 : 1210-01-21
027 : 1211-11-21
028 : 1220-02-21
029 : 1221-12-21
030 : 1230-03-21
031 : 1240-04-21
032 : 1250-05-21
033 : 1260-06-21
034 : 1270-07-21
035 : 1280-08-21
036 : 1290-09-21
037 : 1301-10-31
038 : 1310-01-31
039 : 1311-11-31
040 : 1321-12-31
041 : 1330-03-31
042 : 1340-04-31
043 : 1350-05-31
044 : 1360-06-31
045 : 1370-07-31
046 : 1380-08-31
047 : 1390-09-31
048 : 2001-10-02
049 : 2010-01-02
050 : 2011-11-02
051 : 2020-02-02
052 : 2021-12-02
053 : 2030-03-02
054 : 2040-04-02
055 : 2050-05-02
056 : 2060-06-02
057 : 2070-07-02
058 : 2080-08-02
059 : 2090-09-02
060 : 2101-10-12
061 : 2110-01-12
062 : 2111-11-12
063 : 2120-02-12
064 : 2121-12-12
065 : 2130-03-12
066 : 2140-04-12
067 : 2150-05-12
068 : 2160-06-12
069 : 2170-07-12
070 : 2180-08-12
071 : 2190-09-12
072 : 2201-10-22
073 : 2210-01-22
074 : 2211-11-22
075 : 2220-02-22
076 : 2221-12-22
077 : 2230-03-22
078 : 2240-04-22
079 : 2250-05-22
080 : 2260-06-22
081 : 2270-07-22
082 : 2280-08-22
083 : 2290-09-22
084 : 3001-10-03
085 : 3010-01-03
086 : 3011-11-03
087 : 3020-02-03
088 : 3021-12-03
089 : 3030-03-03
090 : 3040-04-03
091 : 3050-05-03
092 : 3060-06-03
093 : 3070-07-03
094 : 3080-08-03
095 : 3090-09-03
096 : 3101-10-13
097 : 3110-01-13
098 : 3111-11-13
099 : 3120-02-13
100 : 3121-12-13
101 : 3130-03-13
102 : 3140-04-13
103 : 3150-05-13
104 : 3160-06-13
105 : 3170-07-13
106 : 3180-08-13
107 : 3190-09-13
108 : 3201-10-23
109 : 3210-01-23
110 : 3211-11-23
111 : 3220-02-23
112 : 3221-12-23
113 : 3230-03-23
114 : 3240-04-23
115 : 3250-05-23
116 : 3260-06-23
117 : 3270-07-23
118 : 3280-08-23
119 : 3290-09-23
120 : 4001-10-04
121 : 4010-01-04
122 : 4011-11-04
123 : 4020-02-04
124 : 4021-12-04
125 : 4030-03-04
126 : 4040-04-04
127 : 4050-05-04
128 : 4060-06-04
129 : 4070-07-04
130 : 4080-08-04
131 : 4090-09-04
132 : 4101-10-14
133 : 4110-01-14
134 : 4111-11-14
135 : 4120-02-14
136 : 4121-12-14
137 : 4130-03-14
138 : 4140-04-14
139 : 4150-05-14
140 : 4160-06-14
141 : 4170-07-14
142 : 4180-08-14
143 : 4190-09-14
144 : 4201-10-24
145 : 4210-01-24
146 : 4211-11-24
147 : 4220-02-24
148 : 4221-12-24
149 : 4230-03-24
150 : 4240-04-24
151 : 4250-05-24
152 : 4260-06-24
153 : 4270-07-24
154 : 4280-08-24
155 : 4290-09-24
156 : 5001-10-05
157 : 5010-01-05
158 : 5011-11-05
159 : 5020-02-05
160 : 5021-12-05
161 : 5030-03-05
162 : 5040-04-05
163 : 5050-05-05
164 : 5060-06-05
165 : 5070-07-05
166 : 5080-08-05
167 : 5090-09-05
168 : 5101-10-15
169 : 5110-01-15
170 : 5111-11-15
171 : 5120-02-15
172 : 5121-12-15
173 : 5130-03-15
174 : 5140-04-15
175 : 5150-05-15
176 : 5160-06-15
177 : 5170-07-15
178 : 5180-08-15
179 : 5190-09-15
180 : 5201-10-25
181 : 5210-01-25
182 : 5211-11-25
183 : 5220-02-25
184 : 5221-12-25
185 : 5230-03-25
186 : 5240-04-25
187 : 5250-05-25
188 : 5260-06-25
189 : 5270-07-25
190 : 5280-08-25
191 : 5290-09-25
192 : 6001-10-06
193 : 6010-01-06
194 : 6011-11-06
195 : 6020-02-06
196 : 6021-12-06
197 : 6030-03-06
198 : 6040-04-06
199 : 6050-05-06
200 : 6060-06-06
201 : 6070-07-06
202 : 6080-08-06
203 : 6090-09-06
204 : 6101-10-16
205 : 6110-01-16
206 : 6111-11-16
207 : 6120-02-16
208 : 6121-12-16
209 : 6130-03-16
210 : 6140-04-16
211 : 6150-05-16
212 : 6160-06-16
213 : 6170-07-16
214 : 6180-08-16
215 : 6190-09-16
216 : 6201-10-26
217 : 6210-01-26
218 : 6211-11-26
219 : 6220-02-26
220 : 6221-12-26
221 : 6230-03-26
222 : 6240-04-26
223 : 6250-05-26
224 : 6260-06-26
225 : 6270-07-26
226 : 6280-08-26
227 : 6290-09-26
228 : 7001-10-07
229 : 7010-01-07
230 : 7011-11-07
231 : 7020-02-07
232 : 7021-12-07
233 : 7030-03-07
234 : 7040-04-07
235 : 7050-05-07
236 : 7060-06-07
237 : 7070-07-07
238 : 7080-08-07
239 : 7090-09-07
240 : 7101-10-17
241 : 7110-01-17
242 : 7111-11-17
243 : 7120-02-17
244 : 7121-12-17
245 : 7130-03-17
246 : 7140-04-17
247 : 7150-05-17
248 : 7160-06-17
249 : 7170-07-17
250 : 7180-08-17
251 : 7190-09-17
252 : 7201-10-27
253 : 7210-01-27
254 : 7211-11-27
255 : 7220-02-27
256 : 7221-12-27
257 : 7230-03-27
258 : 7240-04-27
259 : 7250-05-27
260 : 7260-06-27
261 : 7270-07-27
262 : 7280-08-27
263 : 7290-09-27
264 : 8001-10-08
265 : 8010-01-08
266 : 8011-11-08
267 : 8020-02-08
268 : 8021-12-08
269 : 8030-03-08
270 : 8040-04-08
271 : 8050-05-08
272 : 8060-06-08
273 : 8070-07-08
274 : 8080-08-08
275 : 8090-09-08
276 : 8101-10-18
277 : 8110-01-18
278 : 8111-11-18
279 : 8120-02-18
280 : 8121-12-18
281 : 8130-03-18
282 : 8140-04-18
283 : 8150-05-18
284 : 8160-06-18
285 : 8170-07-18
286 : 8180-08-18
287 : 8190-09-18
288 : 8201-10-28
289 : 8210-01-28
290 : 8211-11-28
291 : 8220-02-28
292 : 8221-12-28
293 : 8230-03-28
294 : 8240-04-28
295 : 8250-05-28
296 : 8260-06-28
297 : 8270-07-28
298 : 8280-08-28
299 : 8290-09-28
300 : 9001-10-09
301 : 9010-01-09
302 : 9011-11-09
303 : 9020-02-09
304 : 9021-12-09
305 : 9030-03-09
306 : 9040-04-09
307 : 9050-05-09
308 : 9060-06-09
309 : 9070-07-09
310 : 9080-08-09
311 : 9090-09-09
312 : 9101-10-19
313 : 9110-01-19
314 : 9111-11-19
315 : 9120-02-19
316 : 9121-12-19
317 : 9130-03-19
318 : 9140-04-19
319 : 9150-05-19
320 : 9160-06-19
321 : 9170-07-19
322 : 9180-08-19
323 : 9190-09-19
324 : 9201-10-29
325 : 9210-01-29
326 : 9211-11-29
327 : 9220-02-29
328 : 9221-12-29
329 : 9230-03-29
330 : 9240-04-29
331 : 9250-05-29
332 : 9260-06-29
333 : 9270-07-29
334 : 9280-08-29
335 : 9290-09-29

 

 

 

  

posted @ 2021-12-02 13:22  快雪  阅读(180)  评论(0)    收藏  举报