试题 历届试题 回文日期
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按 yyyymmdd 的格式写成一个8位数是 ,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期: 即2021年12月2日。
也有人表示 并不仅仅是一个回文日期,还是一个 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 型的回文日期: 即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个 型的回文日期各是哪一天。
输入格式
输入包含一个八位整数 ,表示日期。
输出格式
输出两行,每行1个八位数。
第一行表示下一个回文日期,第二行表示下一个 型的回文日期。
样例输入
20200202
Data
样例输出
20211202
21211212
Data
评测用例规模与约定
对于所有评测用例,, 保证 是一个合法日期的 8 位数表示。
思路:只要认真研究,有什么特殊的情况,这条题目其实很简单,乍一看,我们第一时间会想到直接从0-99999999循环验证,但是这是回文日期,不是回文数,日期,年月日不能为零,并且,你的月份不能超过12,天数最多不能超过31,而且当你在闰年的时候,月份的天数是不一样的,所以这里我们要熟悉判断闰年的经典程序语句
if((year%100!=0&&year%4==0)||year%400==0)
注意,以上语句基本适用各种日期类题目!!
还有,我们要熟知基本日期类题目套路程序思想,标明月份天数,判断是否闰年,当月份达到12时,星期到达7,天数到本月的天数极限的时候,要重新将其变量初始化。
int month_days[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
以下为参考代码
#include<bits/stdc++.h> using namespace std; int a[9];// int month_day[13]={0,31,0,31,30,31,30,31,31,30,31,30,31}; int year,month=1,day=1; //判断i是否为合法年份 bool judge(){ if((year%100!=0&&year%4==0)||year%400==0){ month_day[2]=29; } else{ month_day[2]=28; } if(day<=month_day[month]&&month<=12&&month!=0&&day!=0&&year!=0){ return true; } return false; } int main(){ int n; cin>>n; int cnt=0; for(int i=n+1;i<=99991231;i++){ year=i/10000; day=i%100; month=i/100%100; if(!judge()){ continue; } int i1=i; int j=1; while(i1){ a[j]=i1%10; i1/=10; j++; } int t=1; for(int k=1;k<=4;k++){ if(a[k]!=a[8-k+1]){ t=0; } } if(t==0){ continue; } else{ cnt++; int x=a[1],y=a[2]; if(cnt==1){ cout<<i<<endl; //判断这是回文日期,还得判断他是否是ab形,因为回文日期和ab形可能会相等。 if(a[3]==x&&a[6]==x&&a[8]==x&&a[4]==y&&a[5]==y&&a[7]==y){ cnt++; cout<<i<<endl; } } else if(cnt==2){ if(a[3]==x&&a[6]==x&&a[8]==x&&a[4]==y&&a[5]==y&&a[7]==y){ cout<<i<<endl; } else{ cnt--; } } } if(cnt==2){ break; } } return 0; }