今天是回文日吗?
对于2011年11月2日,就是一个回文日。因为20111102是回文。题目给出一个起始日期a和终止日期b,请找出[a, b]中的所有回文日。
输入格式:
输入按 yyyymmdd - yyyymmdd 的格式给出。
题目保重日期合法。
闰年的判断规则是“四年一闰,百年不闰,四百年再闰”,即年份是 4 的倍数,且不是 100 的倍数的,为普通闰年;年份是整百数的,必须是 400 的倍数才是闰年。
输出格式:
按照时间顺序,每行按照yyyymmdd格式输出一个回文日。
输入样例:
19991001 - 20200202
输出样例:
20011002
20100102
20111102
20200202
参考代码:
#include<bits/stdc++.h>
using namespace std;
bool leap(int y){
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) return 1;//闰年
else return 0;
}
int main(){
int mon[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
string s,t;
cin >> s >> t >> t;
int y = stoi(s.substr(0,4));
int m = stoi(s.substr(4,2));
int d = stoi(s.substr(6,2));
int end = stoi(t);
while (y * 10000 + m * 100 + d <= end){
int x = d % 10 * 10 + d / 10;//日期数反转
x = x * 100 + m % 10 * 10 + m / 10;//月日翻转
if (x == y) printf("%04d%02d%02d\n", y, m, d);//反转后与年一样 是回文
if (m==2 && d==28 && leap(y)) d = 29;//是闰年
else{//不是闰年
if (d < mon[m]) d++;//还没到一个月的最后一天 ,循环下一天
else{
d = 1;//从下一个月开始
if (m == 12) m = 1, y++;
else m++;
}
}
}
return 0;
}