在 2021 年 12 月 2 日这天,有人发了这么一张图,上书“千年一遇对称日,万事圆满在今朝”。话是挺吉利的,但好像下一个对称日并不需要等上一千年…… 下面任给一个人的生卒年份,请你列出来这个人一辈子经过的所有对称日。
输入格式:
输入第一行给出一个人的名字,是由不超过30个字符的英文字母和空格组成的、以回车结束的非空字符串。第二行按 yyyymmdd - yyyymmdd 的格式给出这个人的生卒年(yyyy)、月(mm)、日(dd)。
虽然生卒日期可能是虚构的,但题目保证出生日期在去世日期之前,且每个日期都是合法的,从 00010101 到 99991231。注意这里遵循“四年一闰,百年不闰,四百年再闰”的规则定义闰年,即年份是 4 的倍数,且不是 100 的倍数的,为普通闰年;年份是整百数的,必须是 400 的倍数才是闰年。闰年跟普通年的区别就是 2 月有 29 天。
输出格式:
首先在第一行原样输出这个人的名字。随后按照时间顺序,每行输出该人所经历的一个对称日,格式与输入格式相同。注意:生卒日期也包含在内。
输入样例:
Katherine Johnson
19180826 - 20200224
输出样例:
Katherine Johnson
20011002
20100102
20111102
20200202
AC代码:
#include<bits/stdc++.h>
using namespace std;
bool leap(int y)//判断闰年leap year
{
if((y%4==0&&y%100!=0)||y%400==0) return true;
else return false;
}
int main()
{
int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
string na;
getline(cin,na);
cout<<na<<endl;
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)
{
//利用月和日反过来等于年份来判断是否对称
// !如果用下列四行字符串反转月和日的方法因复杂度比较大会有一个测试点运行超时!
// string st=to_string(y*10000+m*100+d);
// string ss=st.substr(4,4);
// reverse(ss.begin(),ss.end());
// int x=stoi(ss);
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;
}