蓝桥杯 回文日期

回文日期

https://www.acwing.com/problem/content/description/2870/在这里插入图片描述
在这里插入图片描述
这题的关键就是日期合法性的判别,根据年份按照回文规则判断月份是否合法、天数是否合法,天数的判别又涉及到闰年的判断

#include<bits/stdc++.h>
using namespace std;
int maxday(int year,int mon){
    
    //找到该年该月的天数
    switch(mon){
    
    
        case 2://二月天数取决于是否是闰年
            if((year%4==0 && year%100==1)|| year%400==0)
                return 29;//闰年29天
            else
                return 28;//平年28天
            break;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8: 
        case 10:
        case 12:
            return 31;
        default:
            return 30;
    }
     
}
void print(int y,int m,int d){
    
    
    cout<<y;
    if(m<10)
        cout<<"0"<<m;
    else
        cout<<m;
    if(d<10)
        cout<<"0"<<d<<endl;
    else
        cout<<d<<endl;
}
int main(){
    
    
    int y,m,d;
    scanf("%4d%2d%2d",&y,&m,&d);
    // cout<<maxday(2020,4);
    int flag1=0;
    for(int i=y;;i++){
    
    
        int nm=i%10*10+i/10%10;
        int nd=i/100%10*10+i/1000;
        if(i>y){
    
    //不是同一年
            if(nm<=12 && nm>=1 && nd<=maxday(i,nm)){
    
    
                if(flag1==0){
    
    //普通回文
                     print(i,nm,nd);
                     flag1=1;
                }
                if(i/1000==i/10%10 && i/100%10==i%10){
    
    //ABAB型
                    print(i,nm,nd);
                    break;
                }
                    
            }
        }
        else{
    
    //同一年
            if((nm>m && nm<=12 && nd<=maxday(y,m))|| (nm==m && nd>d && nd<=maxday(y,m))){
    
    
                if(flag1==0){
    
    //普通回文
                     print(i,nm,nd);
                     flag1=1;
                }
                if(i/1000==i/10%10 && i/100%10==i%10 && i/1000 !=i/100%10){
    
    //ABAB型
                    print(i,nm,nd);
                    break;
                }
            }
        }
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Supreme7/article/details/114589764