回文日期 (★)
题目信息
2020 年省赛-填空题
✧ C/C++ A 组第 7 题;C/C++ B 组第 7 题
✧ Java A 组第 7 题
【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为
如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文
数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年
之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文
日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日
期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101 ⩽ N ⩽ 89991231,保证 N 是一个合法日期的 8 位数
表示。
【输出格式】
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
【样例输入】
20200202
【样例输出】
20211202
21211212
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果作为一个整数,在
提交答案时只填写这个整数,填写多余的内容将无法得分。
//这里的思路是从给出的年月日开始枚举 计算每个合法日期的下一天
//然后检查是否满足上述所给的条件(回文回文或回回文文)
这题的收获:sscanf(详见AcWing 1231. 航班时间)和sprintf的用法 一个是将前面赋值给后面 另一个是将后面赋值给前面
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap(int year)//看看是否是闰年
{
if(year%4==0&&(year%100!=0||year%400==0)) return 1;
return 0;
}
int get_days(int year,int month)
{
if(month==2)
return months[month]+is_leap(year);
return months[month];
}
void next_day(int& y,int& m,int& d)//这里也算个模板了 背会吧 做日期问题快一些
{
d++;
if(d>get_days(y,m))
{
d=1;
m++;
if(m>12)
{
m=1;
y++;
if(y>9999) y=0;
}
}
}
bool check1(char str[])
{
for(int i=0,j=7;i<=j;i++,j--)
{
if(str[i]!=str[j]) return false;
}
return true;
}
bool check2(char str[])
{
char a=str[0],b=str[1],c=str[2],d=str[3];
return a!=b&&a==c&&b==d;
}
int main()
{
int y,m,d;
scanf("%04d%02d%02d",&y,&m,&d);
bool found1=false,found2=false;
while(!found1||!found2)
{
next_day(y,m,d);
char str[10]={0};
sprintf(str,"%04d%02d%02d",y,m,d);//注意sprintf的用法 是将后面的y,m,d赋值给前面的str
//同样的还有sscanf是把前面的赋值给后面
//用法:
<!--
string line;
getline(cin,line);
sscanf(line.c_str(),"%d:%d:%d:%d:%d:%d:%d(+%d)",&h,&m1,&s1,&h2,&m2,&s2,&d);
//line.c_str()表示line的子串(表示指针 必须这么写)
//这里sscanf这么做是为了读取h1:m1:s1 h2:m2:s2(+1)这样的数据 是将line.c_str()赋值给h1,m1,s1……)
-->
if(check1(str))
{
if(!found1) puts(str),found1=true;
if(check2(str)&&!found2) puts(str),found2=true;
}
}
return 0;
}