题目:
466. 回文日期 - AcWing题库
思路:
1.如果正向考虑,计算两天之间所以的回文数,应该如何枚举?没有明确的进制,那么只能列一个日历,这样会比较麻烦。
2.我们不妨采用逆向思维,将所以8位回文数列出,在其中寻找:
1.在两天之间的
2.满足日期表示规范的
3.统计个数。
注意:枚举8位数回文数时我们只需要枚举前4位,后面翻转得到。
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int cnt;
int date1, date2;
int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
bool isprime(int x)
{
if (x % 400 == 0 || x % 4 == 0 && x % 100 != 0)
return true;
else return false;
}
bool Is(int n)
{
if (n < date1 || n > date2)return false;
int day = n % 100;
int Month = n % 10000 / 100;
if (isprime(n / 10000))month[2] = 29;
if (day > 31 || Month==0||Month > 12 || day==0||day > month[Month])return false;
month[2] = 28;
return true;
}
int main()
{
cin >> date1 >> date2;
for (int i = 1000; i <= 9999; i++) {
int t = i; int sum = i;
while (t > 0) { sum = sum * 10 + t % 10; t /= 10; }
if (Is(sum))cnt++;
}
cout << cnt;
}