解题思路:
注意事项:
参考代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct RQ{ int yyyy; int MM; int dd; }; int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; inline int isRun(int y,int m){ if(y%4==0 && y%100!=0 || y%400==0) if(m==2) return month[m]+1; return month[m]; } int a[4]; struct RQ rq[1000]; bool cmp(struct RQ rq1,struct RQ rq2){ if(rq1.yyyy==rq2.yyyy){ if(rq1.MM==rq2.MM) return rq1.dd<rq2.dd; return rq1.MM<rq2.MM; } return rq1.yyyy<rq2.yyyy; } int main(){ int num=0; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); scanf("%d/%d/%d",&a[1],&a[2],&a[3]);//a[2]一定不能是年份,月份一定是a[1]或者a[2] int y1=a[1],y2=a[2],y3=a[3]; //a[1]肯定<=12 a[2]肯定<=31 a[3]可能性很多 sort(a+1,a+3+1); //年月日 //a[1]为年份 rq[num].yyyy=2000+a[1]; if(a[3]<=12){ //a[2],a[3]都可能是月份 rq[num].MM=a[2],rq[num].dd=a[3]; rq[++num].yyyy=2000+a[1],rq[num].MM=a[3],rq[num].dd=a[2]; num++; } else if(a[3]>12){ if(a[3]<=isRun(2000+a[1],a[2])) rq[num].MM=a[2],rq[num].dd=a[3],num++; } //a[2]为年份 rq[num].yyyy=2000+a[2]; if(a[3]<=12){ //a[3],a[1]都可能是月份 rq[num].MM=a[1],rq[num].dd=a[3]; rq[++num].yyyy=2000+a[2],rq[num].MM=a[3],rq[num].dd=a[1]; num++; } else if(a[3]>12){ if(a[3]<=isRun(2000+a[2],a[1])) rq[num].MM=a[1],rq[num].dd=a[3],num++; } //a[3]为年份 if(a[3]>=60){ rq[num].yyyy=1900+a[3]; if(a[2]>12){ if(a[2]<=isRun(1900+a[3],a[1])) rq[num].MM=a[1],rq[num].dd=a[2]; //num++; } else if(a[2]<=12){ //a[2],a[1]都可能是月份 rq[num].MM=a[1],rq[num].dd=a[2]; rq[++num].yyyy=1900+a[3],rq[num].MM=a[2],rq[num].dd=a[1]; //num++; } } else if(a[3]<60){ rq[num].yyyy=2000+a[3]; if(a[2]>12){ if(a[2]<=isRun(2000+a[3],a[1])) rq[num].MM=a[1],rq[num].dd=a[2]; //num++; } else if(a[2]<=12){ //a[2],a[1]都可能是月份 rq[num].MM=a[1],rq[num].dd=a[2]; rq[++num].yyyy=2000+a[3],rq[num].MM=a[2],rq[num].dd=a[1]; //num++; } } sort(rq,rq+num+1,cmp); //便于理解,可以看到重复的日期 /* for(int i=0;i<=num;i++){ cout << rq[i].yyyy << '-' << rq[i].MM << '-' << rq[i].dd << endl; } */ for(int i=0;i<=num;i++){ if(rq[i].MM!=0 && rq[i].dd!=0) //月份和日期不能为0 if(rq[i].yyyy%100!=y2 || y1==y2 || y3==y2){ //按道理第二个不能为年份,但是如果其他两个存在与之相等,则可以 if(rq[i].MM==y1 || rq[i].MM==y2){ if(rq[i].yyyy==rq[i-1].yyyy && rq[i].MM==rq[i-1].MM && rq[i].dd==rq[i-1].dd);//去重 else{ cout << rq[i].yyyy << '-'; if(rq[i].MM<10) cout << '0' << rq[i].MM << '-'; else cout << rq[i].MM << '-'; if(rq[i].dd<10) cout << '0' << rq[i].dd << endl; else cout << rq[i].dd << endl; } } } } return 0; }
0.0分
3 人评分
大小写转换 (C语言代码)浏览:904 |
大神老白 (C语言代码)浏览:690 |
字符串的输入输出处理 (C语言代码)浏览:1019 |
printf基础练习2 (有点不明白)浏览:887 |
本人酷爱递归实现很多问题,这里也是浏览:632 |
WU-陶陶摘苹果2 (C++代码)浏览:1018 |
Cylinder (C语言描述+详细分析)浏览:3374 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:727 |
1126题解浏览:649 |
1048题解(读入回车问题)浏览:628 |