原题链接:蓝桥杯2017年第八届真题-日期问题
解题思路:
注意事项:
参考代码:
#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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复