小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入描述
一个日期,格式是 "AA/BB/CCAA/BB/CC" (0 \leq A, B, C \leq 90≤A,B,C≤9)。
输出描述
输出若干个不相同的日期,每个日期一行,格式是 "yyyy-MM-dd"。多个日期按从早到晚排列。
输入输出样例
输入
02/03/04
输出
2002-03-04
2004-02-03
2004-03-02
注意:
1.输入数据的大小比较
2.闰年的判断
3.每月的最多天数
4.数据两两相同时的输出
代码如下:
#include <stdio.h>
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void judges(int a,int b,int c);
int main(){
int num1,num2,num3;//存储读取到的三个数值
char ch1,ch2;//存储'/'
scanf("%d",&num1);//依次读取数据
scanf("%c",&ch1);
scanf("%d",&num2);
scanf("%c",&ch2);
scanf("%d",&num3);
//将三个数值进行比较,分不同的情况采取行动,注意相等时的处理要不同。注意根据数据的顺序改变调用函数时参数的传递
if(num1==num2 && num1==num3 && num2==num3){
judges(num1,num2,num3);//y m d
}
else{
if(num1>=num2 && num1>=num3){
judges(num3,num2,num1);//d m y
judges(num3,num1,num2);//m d y
judges(num1,num2,num3);//y m d
}
if(num2>=num1 && num2>=num3 && num1>num3){
judges(num3,num1,num2);//m d y
judges(num3,num2,num1);//d m y
judges(num1,num2,num3);//y m d
}
if(num2>num1 && num2>num3 && num3>=num1){
judges(num3,num1,num2);//m d y
judges(num1,num2,num3);//y m d
if(num1!=num3){
judges(num3,num2,num1);//d m y
}
}
if(num3>=num1 && num3>=num2 && num1>=num2){
judges(num1,num2,num3);//y m d
judges(num3,num2,num1);//d m y
if(num1!=num2){
judges(num3,num1,num2);//m d y
}
}
if(num3>num1 && num3>num2 && num1<num2){
judges(num1,num2,num3);//y m d
judges(num3,num1,num2);//m d y
judges(num3,num2,num1);//d m y
}}
return 0;
}
void judges(int year,int month,int day){//自定义的函数,用来将符合条件的数据按照指定格式输出
if(year<60){year+=2000;}
else{year+=1900;}
if(((year%4==0) && (year%100!=0)) || (year%400==0)){mon[1]=29;}
if(0<=month && month<=12 && mon[month-1]>=day && day>0){printf("%d-%2.2d-%2.2d\n",year,month,day);}
}