蓝桥杯试题 历届试题 日期问题

问题描述
  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
  一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输出格式
  输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02
这道题关键是如何按顺序输出和如果小于等于9的时候该怎么办。
我是将年月日转换成一段连续的数字,输出时把它们拆开就行,以下是代码
代码

#include<bits/stdc++.h>
typedef long long ll;
using namespace std; 
int b[5],temp;
long long ans[5];
int months[22]={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年
int monthx[22]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
int checks(int x) {
    if(x%4==0 && x%100!=0) {
        return 1;
    } else {
        if(x%400==0) {
            return 1;
        }
    }
    return 0;
}
int main()
{
    string a;
	cin>>a;
	int n=a.size();
    int j=0;
    for(int i=0;i<n;i++) {              //将数字提取出来
        if(a[i]>='0' && a[i]<='9') {
            b[j]=(b[j]*10)+(a[i]-'0');
        } else {
            j++;
        }
    }
    if(b[1]>=1 && b[1]<=12 && b[2]>=1 && b[2]<=31) {     //这里是年月日的判定,看懂这个下面
        if(b[0]>=60) {                                   //两个都是一样的。
            temp=1900+b[0];
            if(checks(temp))
            {
                 if(monthx[b[1]]>=b[2])
                 {
                     ans[0]=(temp*10000)+b[1]*100+b[2];
                 }
            } else {
                if(months[b[1]]>=b[2])
                 {
                     ans[0]=(temp*10000)+b[1]*100+b[2];
                 }
            }
        }
          if(b[0]<60) {
            temp=2000+b[0];
        	 if(checks(temp))
            {
                 if(monthx[b[1]]>=b[2])
                 {
                     ans[0]=(temp*10000)+b[1]*100+b[2];
                 }
            } else {
                if(months[b[1]]>=b[2])
                 {
                     ans[0]=(temp*10000)+b[1]*100+b[2];
                 }
            }
        }
    }
    if(b[1]>=1 && b[1]<=31 && b[0]>=1 && b[0]<=12) {
        if(b[2]>=60) {
            temp=1900+b[2];
       		 if(checks(temp))
            {
                 if(monthx[b[0]]>=b[1])
                 {
                     ans[1]=(temp*10000)+b[0]*100+b[1];
                 }
            } else {
                if(months[b[0]]>=b[1])
                 {
                     ans[1]=(temp*10000)+b[0]*100+b[1];
                 }
            }
    }
        if(b[2]<60) {
            temp=2000+b[2];
             if(checks(temp))
            {
                 if(monthx[b[0]]>=b[1])
                 {
                     ans[1]=(temp*10000)+b[0]*100+b[1];
                 }
            } else {
                if(months[b[0]]>=b[1])
                 {
                     ans[1]=(temp*10000)+b[0]*100+b[1];
                 }
            }
        }
    }
     if(b[0]>=1 && b[0]<=31 && b[1]>=1 && b[1]<=12) {
         if(b[2]>=60) {
            temp=1900+b[2];
       		 if(checks(temp))
            {
                 if(monthx[b[1]]>=b[0])
                 {
                     ans[2]=(temp*10000)+b[1]*100+b[0];
                 }
            } else {
                if(months[b[0]]>=b[1])
                 {
                     ans[1]=(temp*10000)+b[1]*100+b[0];
                 }
            }
    }
        if(b[2]<60) {
            temp=2000+b[2];
           if(checks(temp))
            {
                 if(monthx[b[1]]>=b[0])
                 {
                     ans[2]=(temp*10000)+b[1]*100+b[0];
                 }
            } else {
                if(months[b[0]]>=b[1])
                 {
                     ans[2]=(temp*10000)+b[1]*100+b[0];
                 }
            }
        }
     }
    //cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2]<<endl; 
     sort(ans,ans+3);
     for(int i=0;i<4;i++) {      //对整体数字进行切除
         if(ans[i]!=0 && ans[i]!=ans[i+1]) {
             cout<<ans[i]/10000<<"-";
             ans[i]=ans[i]%10000;     
             temp=ans[i]/100;
             if(temp<=9) {
                 cout<<0<<temp<<"-";
             } else {
                 cout<<temp<<"-";
             }
             ans[i]=ans[i]%100;
             if(ans[i]<=9){
                 cout<<0<<ans[i]<<endl;
             } else {
                 cout<<ans[i]<<endl;
             }
         }
     }
    return 0;
}

这个代码可以通过蓝桥杯的测试,但测试数据实在是太小太水了,我甚至写错了代码都可以得分,所以我不太确定代码是否完全正确,以后还会继续钻研这道题,看看能不能更简略一些,实在是太长了,我自己都不想看,如果有更简略的代码,我会更新到这个帖子上的。

发布了12 篇原创文章 · 获赞 0 · 访问量 225

猜你喜欢

转载自blog.csdn.net/weixin_43305294/article/details/105358708