相比于枚举区间内所有字符串来判断是不是回文串,不如构造一个回文串,判断它是不是合法且在给定区间内。
构造回文串可以由前四位生成后四位,也可以后四位生成前四位。后者比较方便,因为生成的回文串一定合法(不用判断闰年,因为0229反过来就是9220为闰年,其余日期都很普通不用判断)。
当生成的回文串一定合法时,只要单纯进行值的比较就可以判断是否在区间内了(n <= x <= m)
Code:
#include <iostream>
using namespace std;
int n, m;//两个八位的截止日期
int cnt;//统计回文串的数量
int s[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
cin >> n >> m;
for(int i = 1; i <= 12; i ++ )//构造回文串
{
for(int j = 1; j <= s[i]; j ++ )
{
int x2 = i * 100 + j;
int x1 = x2 % 10 * 1000 + x2 % 100 / 10 * 100 + x2 % 1000 / 100 * 10 + x2 / 1000;
int res = x1 * 10000 + x2;
if(res >= n && res <= m) cnt ++ ;
}
}
cout << cnt << endl;
// system("pause");
return 0;
}