2002-03-04
2004-02-03
2004-03-02
因为输入有三种形式,年/月/日 ,月/日/年 ,日/月/年,三种形式的日期逐个判断是否合法既可以,最后对日期从小到大排序
注意两个比较特殊的数据:
1、当年的位置是 00 的时候
2、当三个参数相同的时候,要注意去重,比如01/01/01的输出只有一个
#include<iostream> #include<string> #include<algorithm> #include<math.h> using namespace std; int t=0; struct node { int y,m,d; }p[120]; int find(int x) { if(x%4==0&&x%100!=0||x%400==0) return 1; else return 0; } bool cmp(node a,node b) { if(a.y!=b.y) return a.y<b.y; else { if(a.m!=b.m) return a.m<b.m; else a.d<b.d; } } void check(int yy,int mm,int dd) { int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(yy>=60) yy=1900+yy; else yy=2000+yy; if(find(yy)==1)//判断闰年 day[2]++; if(mm>0&&mm<=12) { if(dd>0&&dd<=day[mm]) { p[t].y=yy; p[t].m=mm; p[t++].d=dd; } } } int main() { string s; cin>>s; int x1=(s[0]-‘0‘)*10+(s[1]-‘0‘); int x2=(s[3]-‘0‘)*10+(s[4]-‘0‘); int x3=(s[6]-‘0‘)*10+(s[7]-‘0‘); // x1/x2/x3 输入的三种可能形式都输进去判断一遍 check(x1,x2,x3);//年/月/日 check(x3,x1,x2);//月/日/年 check(x3,x2,x1);//日/月/年 //check(年,月,日) sort(p,p+t,cmp); for(int i=0;i<t;i++)//输出的时候还要去除重复的日期,比如 s=01/01/01 只有一种情况 { if(i>0&&p[i].y==p[i-1].y&&p[i].m==p[i-1].m&&p[i].d==p[i-1].d) continue; printf("%d-%02d-%02d\n",p[i].y,p[i].m,p[i].d); } return 0; }
原文:https://www.cnblogs.com/-citywall123/p/12333019.html