问题描述:小明正在整理一批文献,这些文献中出现了很多日期,小明知道这些日期都在1960年1月1日至2059年12月31日之间,令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的,更加麻烦的是年份都省略了前两位,使得文献上的一个日期存在很多可能的日期与其对应。
例如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
程序输入格式:AA/BB/CC(0<=A,B,C<=9)
输出格式:输出若干个不相同的日期,每个日期一行格式是:''yyyy-mm-dd''多个日期按从早到晚的顺序排列。
分析:本题的思路很简单,将输入的三个数据分别进行年,月,日的合法判断,如果合法就输出,但是求解本题要注意以下两点。
(1)月份数据的表示
由于每月的天数没有规律性,所以最好的方法就是利用数组将每月的天数表示出来,如:
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
这里还要注意闰年问题,如果是闰年,则二月的数据就会不同,可以采用另一个数组存储
如:int leapdays[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
(2)合法年/月/日的存储
对于一组数据可能会出现重复的合法年/月/日。例如:01/01/01,这三组合法数据都是2001/01/01,所以这要进行去重。
去重时,可以采用直接判断三组数据是否相等的方法,也可以利用C++ STL中的set容器进行自动去重。
用C语言:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//不是闰年的时候 int leapdays[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };//是闰年的时候 int data[4][4];//用来存放日期 int i;//用于数组的序号 int leapyear(int year)//判断是否是闰年 { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } else { return 0; } } void check(int y, int m, int d) { if (y >= 60)//年份的后两位大于60,说明应该是19年开头 { y = 19 * 100 + y; } else//否则是20年开头 { y = 20 * 100 + y; } if (m > 12) return; if(leapyear(y))//判断是否是闰年,采用对应的数组 { if(leapdays[m] 0)//进行去重处理 { for (int j = 0; j < i; j++) { if (data[j][0] == y && data[j][1] == m && data[j][2] == d)//判断日期是不是合法 return; } } data[i][0] = y; data[i][1] = m; data[i][2] = d; i++; } int main() { int a, b, c, e, f, g; int d[3]; i = 0; scanf("%d/%d/%d", &a, &b, &c); check(a, b, c);//分别互换日期查看是否成立 check(c, a, b); check(c, b, a); for (int j = 0; j < i; j++) { d[j] = data[j][0] * 10000 + data[j][1] * 100 + data[j][2]; } for (int m = 0; m < i; m++)//按从早到晚的顺序排列 { for (int n=0; n < i - 1 - m; n++) { if (d[n] > d[n + 1]) { int tmp = d[n]; d[n] = d[n + 1]; d[n + 1] = tmp; } } } for (int j = 0; j < i; j++)//打印 { e = d[j] / 10000; f = (d[j] / 100) % 100; g = d[j] % 100; printf("%d-%02d-%02d\n", e, f, g); } return 0; }
用C++:
#includeusing namespace std; struct date //定义一个结构体存放日期 { int year; int month; int day; }que[4]; int s=0; //用于结构体的序号 int cmp(date x,date y);//比较函数sort的参数,定义了怎样排序 int leapyear(int year);//用于判断是不是闰年 int judge_date(int year,int month,int day);//判断日期是不是合法 void judge(int year,int month,int day);//主要调用上面函数,把日期存进数组 void judge(int year,int month,int day) { int flag=1; //标记日期是否重复 if(year>=60)//年份的后两位大于60,说明应该是19年开头 year = 19* 100 + year; else year = 20* 100 + year; if(judge_date(year,month,day)) { //如果日期合法 for(int i=0;i =day&&day>0&&month>=1&&month<=12) //如果天数小于该月总天数,且大于0,月份也在1~12,则合法 return 1; else return 0; } int leapyear(int year) { //判断是否闰年 if(year%4==0 && year%100!=0 || year%400==0) return 1; else return 0; } int cmp(date x,date y) { //比较函数 if(x.year