小明正在整理一批历史文献。这些历史文献中出现了很多日期。

小明知道这些日期都在1960年1月1日至2059年12月31日。

令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式

一个日期,格式是”AA/BB/CC”。

即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。

输出格式

输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。

多个日期按从早到晚排列。

数据范围

0≤A,B,C≤9

题解:模拟题。

闰年成立条件:如果可以不能整除100,则必须整除4,否则必须整除400.

输入用scanf可以自动转化,输出用printf  %02d可以左边两位不足补零。

AC代码:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int maxn=1e6+6;
int d[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year,int month,int day) {
if(month>12||month==0)return false;
if(day==0)return false;
if(month!=2) {
if(day>d[month])return false;
} else {
int flag=year%100&&year%4||year%400;
if(day>d[month]+flag)return false;
}
return true;
}
main() {
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
for(int i=19600101; i<=20591231; i++) {
int year=i/10000,month=i%10000/100,day=i%100;
if(check(year,month,day)) {
if((year%100==a&&month==b&&day==c)||(year%100==c&&month==a&&day==b)||(year%100==c&&month==b&&day==a)) {
printf("%d-%02d-%02d\n",year,month,day);
}
}
}
}