「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。
日期一类的问题,蓝桥杯近几年好像都有出,这类题目实际上并不难,一般都可以用暴力搜索找出答案,但自己的算法设计一定要合理,不要出现判断出错的情况,不然答案很可能是错的。
题目
思路
给一个字符串形式的数据,然后判断是否存在可能的日期与之对应。因为他输入的格式,我们是不能够去判断的,我们首先肯定是要把这个字符串切割,然后换成我们需要的int类型来判断,这里可用到substr函数以及atoi函数,substr函数就是可以将str类型的一些字符给取出来,二atoi函数就是可以将str类型的数字转换成int类型的数字。给定的数据,一共有三种情况,我们就把这三种情况都去试一试,如果存在,可又转换成str类型,因为最后输出用这个输出方便一些,最后还要将日期从早到晚输出,我们还需比较一下。我们用两个数组来分别存储闰年和非闰年的月份日数,根据年份是否为闰年然后来判断他的日子数和月份数是否能对上,这样判断即可。因为只有三种情况,全部列出,不用考虑时间复杂度。能想到这些,这道题应该已经可以得出答案了。然后就是设计程序了,这里一定要想的缜密一些,不要出错,一般就能pass了。
代码
#include <bits/stdc++.h>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int m2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
string date;
cin>>date;
string str1,str2,str3;
str1=date.substr(0,2);
str2=date.substr(3,2);
str3=date.substr(6,2);
int t=atoi(str1.c_str());
int t1=atoi(str2.c_str());
int t2=atoi(str3.c_str());
string S,S1,S2;
S=S1=S2="a";
if(t%4==0&&t1<=12)
{
if(t2<=m2[t1]&&t2!=0){
if(t<60)
S=string("20")+str1+'-'+str2+'-'+str3;
else
S=string("19")+str1+'-'+str2+'-'+str3;
}
}
if(t%4!=0&&t1<=12)
{
if(t2<=m[t1]&&t2!=0){
if(t<60)
S=string("20")+str1+'-'+str2+'-'+str3;
else
S=string("19")+str1+'-'+str2+'-'+str3;
}
}
if(t2%4==0&&t<=12){
if(t1<=m2[t]&&t1!=0){
if(t2<60)
S1=string("20")+str3+'-'+str1+'-'+str2;
else
S1=string("19")+str3+'-'+str1+'-'+str2;
}
}
if(t2%4!=0&&t<=12){
if(t1<=m[t]&&t1!=0){
if(t2<60)
S1=string("20")+str3+'-'+str1+'-'+str2;
else
S1=string("19")+str3+'-'+str1+'-'+str2;
}
}
if(t2%4==0&&t1<=12){
if(t<=m2[t1]&&t!=0){
if(t2<60)
S2=string("20")+str3+'-'+str2+'-'+str1;
else
S2=string("19")+str3+'-'+str1+'-'+str2;
}
}
if(t2%4!=0&&t1<=12){
if(t<=m[t1]&&t!=0){
if(t2<60)
S2=string("20")+str3+'-'+str2+'-'+str1;
else
S2=string("19")+str3+'-'+str1+'-'+str2;
}
}
string ss[3];
if(S==S2)
S2="a";
if(S==S1)
S1="a";
if(S1==S2)
S2="a";
ss[0]=S;
ss[1]=S1;
ss[2]=S2;
sort(ss,ss+3);
for(int i=0;i<3;i++){
if(ss[i]!="a")
cout<<ss[i]<<endl;
}
}