这周周赛的题,我感觉我这题写的还是不错的,用到了上周周赛的口算题中别人题解的函数和最近了解substr还有去年天梯校赛有个日期检验的题,都有用到。
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日
的,有采用月/日/年
的,还有采用日/月/年
的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04
,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
一个日期,格式是 AA/BB/CC
。(0≤�,�,�≤90≤A,B,C≤9)
输出格式
输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd
。多个日期按从早到晚排列。
输入输出样例
输入 #1复制
02/03/04
输出 #1复制
2002-03-04 2004-02-03 2004-03-02
想法:
首先是输入,我用了substr把年月日分开,然后分三种情况,年月日,日月年,月日年,分别把他们转换为数字,年的要处理一下,分为20年和19年。然后检验日期的正确性,正确的话就存在结构体数组中,再把数组排序。最后是输出,输出不能重复。我们就先把第一个输出来,然后从第二个开始循环,看当前的和上一个是否相同,不同就输出。这个输出方法还挺好用,我用了挺多次的。结构体也很好用,排序方便。本来我输出想用to_string函数弄成一个string然后整个输出的,但不会排序,就想到用结构体了。
代码:
#include<bits/stdc++.h>
using namespace std;
string a,b,c;
string d;
struct ty{
int y,m,d;
}ans[5];
int Year(string n){//处理年份
int num;
if(n<="59"){
num=20;
}
else num=19;
for(int i=0;i<n.size();i++) num=num*10+(n[i]-'0');
return num;
}
int tonum(string n){//字符串转数字
int num=0;
for(int i=0;i<n.size();i++) num=num*10+(n[i]-'0');
return num;
}
int rn(int y){//闰年
if(y%4==0&&y%100!=0||y%400==0) return 1;
return 0;
}
int tdate(int yy,int mm,int dd){///检查日期正确性
if(mm<1||dd<1||mm>12||dd>31) return 0;
if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12){
if(dd<=31) return 1;
else return 0;
}
if(mm==4||mm==6||mm==9||mm==11){
if(dd<=30) return 1;
else return 0;
}
if(rn(yy)){
if(dd<=29) return 1;
else return 0;
}
else {
if(dd<=28) return 1;
else return 0;
}
}
bool cmp(ty a,ty b){
if(a.y==b.y&&a.m==b.m) return a.d<b.d;
if(a.y==b.y) return a.m<b.m ;
return a.y <b.y ;
}
int main(){
cin>>d;
a=d.substr(0,2);
b=d.substr(3,2);
c=d.substr(6,2);
int cnt=0;
for(int i=0;i<3;i++){
int y,m,d;
if(i==0){//年月日
y=Year(a);
m=tonum(b);
d=tonum(c);
}
else if(i==1){
y=Year(c);
m=tonum(a);
d=tonum(b);
}
else if(i==2){
y=Year(c);
m=tonum(b);
d=tonum(a);
}
if(tdate(y,m,d)){
ans[cnt++].y=y;
ans[cnt-1].m=m;
ans[cnt-1].d=d;
}
}
sort(ans,ans+cnt,cmp);
printf("%04d-%02d-%02d\n",ans[0].y,ans[0].m,ans[0].d);
for(int i=1;i<cnt;i++){
if(ans[i].d!=ans[i-1].d||ans[i].m!=ans[i-1].m||ans[i].y!=ans[i-1].y)
printf("%04d-%02d-%02d\n",ans[i].y,ans[i].m,ans[i].d);
}
return 0;
}