蓝桥杯—回文日期(附带坑点)

题目链接:回文日期

蓝桥杯—回文日期(附带坑点)_第1张图片

思路

总的来说就是给你一个日期,去找它下一个最近的回文日期和ABABBABA型的回文日期。

要做的准备:

  1. 判断+1天后,该日期是否出现0~9之外的东东

  2. 判断+1天后,年份属于平年或闰年

  3. 判断日期每部分数字是否合法
    即:
    月份:1~12
    日:(1,3,5,7,8,10,12月)有31天 ,(4,6,9,11月)有30天,2月(平年28天)(闰年29天)

  4. 找回文串

**注意点: 11111111这种纯A型的也属于ABABBABA型的,坑点!!!!!!o( ̄ヘ ̄o#)

代码(原谅我只会暴力):

为了练习字符处理,我抛弃了简单的整型处理!!!w(゚Д゚)w

#include 
#include 
#include 
#include 
#include 
using namespace std;
char a[10];
int yh,yab,flag;
bool pan_r(int y)//判断是否为闰年
{
    if(y%4==0&&y%100!=0||y%400==0)
        return true;
    else
        return false;
}
void xiu()//修改+1天后的日期,保证日期均为0~9的数字字符
{
    for(int i=7;i>0;i--)
    {
        if(a[i]==':')
        {
            a[i]='0';
            a[i-1]+=1;
        }
    }
}
void pan_ymd()//+1天后判断年月日是否还合法,不合法修改
{
    xiu();
    int y,m,d;
    y=(a[0]-'0')*1000+(a[1]-'0')*100+(a[2]-'0')*10+a[3]-'0';   //年
    m=(a[4]-'0')*10+a[5]-'0';    //月
    d=(a[6]-'0')*10+a[7]-'0';    //日
    if(m!=2)       //进行非二月份的日期合法判断
    {
        if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
        {
            if(d==32)    //最多31天
            {
                a[6]='0';
                a[7]='1';
                a[5]+=1;
                m+=1;
            }
        }
        else if(m==4||m==6||m==9||m==11)
        {
            if(d==31)     //最多30天
            {
                a[6]='0';
                a[7]='1';
                a[5]+=1;
            }
        }
        //非法日期,月份不可能超过12
        if(m>12)
        {
            a[4]='0';
            a[5]='1';
            y+=1;
            int i=3;
            while(y)
            {
                a[i--]='0'+y%10;
                y/=10;
            }
        }
    }
    else
    {
        if(pan_r(y))
        {
            if(d==30)   //闰年二月最多29天
            {
                a[6]='0';
                a[7]='1';
                a[5]+=1;
            }
        }
        else
        {
            if(d==29)    //平年二月最多28天
            {
                a[6]='0';
                a[7]='1';
                a[5]+=1;
            }
        }
    }
}
void pan_hw()//进行回文串的判断,筛选出第一个回文串和第一个ABABBABA型的回文串
{
    int i,j,x=0,y=0,s;
    for(i=0;i<8;i++)
        x=x*10+(a[i]-'0');
    s=x;
    while(s)
    {
        y=y*10+s%10;
        s/=10;
    }
    if(x==y)
    {
        if(!flag)
        {
            yh=x;    //找到第一个回文串
            flag=1;
        }
        if(a[0]==a[2]&&a[0]==a[5]&&a[0]==a[7]&&a[1]==a[3]&&a[1]==a[4]&&a[1]==a[6])
        {
            flag=2;
            yab=x;    //找到第一个ABABBABA型的回文串
        }
    }
}
int main()
{
    int i,j;
    scanf("%s",a);
    while(flag!=2)
    {
        a[7]+=1;     //加一天
        pan_ymd();
        pan_hw();
        if(flag==2)    //两个回文串都找到
            printf("%d\n%d",yh,yab);
    }
    return 0;
}

你可能感兴趣的:(算法,成长道路,算法)