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

题目链接:回文日期

在这里插入图片描述

思路

总的来说就是给你一个日期,去找它下一个最近的回文日期和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 <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
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;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值