AcWing 2867. 回文日期(每日一题)

简介: AcWing 2867. 回文日期(每日一题)

原题链接:2867. 回文日期 - AcWing题库

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。


因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。


我们称这样的日期是回文日期。


有人表示 20200202 是“千年一遇” 的特殊日子。


对此小明很不认同,因为不到 22 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。


也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。


对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 21212121 年 12 月 12 日。


算不上“千年一遇”,顶多算“千年两遇”。


给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。


注意: 本题数据保证一定有解。


注意


下一个回文日期和下一个 ABABBABA 型的回文日期可能是同一天。


ABABBABA 型的回文日期,需要满足 A≠B。


输入格式


输入包含一个八位整数 N,表示日期。


输出格式


输出两行,每行 1 个八位数。


第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。


数据范围


对于所有评测用例,10000101≤N≤89991231,保证 N 是一个合法日期的 88 位数表示。

输入样例:

20200202

输出样例:

20211202
21211212

模拟题,按照思路直接写即可,注意判断闰年和月份。

AC代码:

#include<iostream>
using namespace std;
bool found1=false,found2=false;//found1为下一个回文日期判断是否找到,found2ABABBABA 型的回文日期
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份天数数组
int is_leap(int year){//判断是否为闰年
  if(year%4==0&&year%100||year%400==0){
    return 1;
  }
  return 0;
}
int get_day(int year,int month){//获取天数
  if(month==2){
    return 28+is_leap(year);
  }
  return months[month];
}
void next_day(int &y,int &m,int &d){//自增到下一天
  d++;
  if(d>get_day(y,m)){
    d=1;
    m++;
    if(m>12){
      m=1;
      y++;
    }
  }
}
bool cheak1(char s[]){//判断日期是否为回文日期
  for(int i=0,j=7;i<j;i++,j--){
    if(s[i]!=s[j]){
      return false;
    }
  }
  return true;
}
bool cheak2(char s[]){//判断是否为ABABBABA 型的回文日期
  char a=s[0];
  char b=s[1];
  char c=s[2];
  char d=s[3];
  if(a==c&&b==d&&a!=b){
    return true;
  }
  return false;
}
int main(){
  int y,m,d;
  char s[10];//中介作用,负责转化
  scanf("%04d%02d%02d",&y,&m,&d);
  while(!found1||!found2){
    next_day(y,m,d);
    sprintf(s,"%04d%02d%02d",y,m,d);
    if(cheak1(s)){
      if(!found1){
        found1=true;
           puts(s);
      }
      if(!found2&&cheak2(s)){
      found2=true;
      puts(s);
        }
    }
  }
  return 0;
}

文章尚有不足,请各位大佬指出,共同冲刺蓝桥杯。


相关文章
AcWing 3498. 日期差值(每日一题)
AcWing 3498. 日期差值(每日一题)
|
存储 算法 测试技术
【AcWing每日一题】4653. 数位排序
【AcWing每日一题】4653. 数位排序
110 0
|
人工智能
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
64 0
|
人工智能
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
76 0
【leetcode每日一题】1027. 最长等差数列
【leetcode每日一题】1027. 最长等差数列
|
Java 测试技术 C语言
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
|
机器学习/深度学习 存储 算法
《剑指offer》题解——week2
由于需要对结果进行取余,导致`不能使用动态规划`,因为取模导致了dp的运算出现了问题。dp是通过最优子问题来计算出最终结果的,而取模之后就导致计算最优子问题出现了问题,计算出来的`dp[i-j]*j`表面上可能是最大的,但是`dp[i-j]`也是经过取模运算的,从而这会导致`dp[i]`不是由前面的最优子问题推出来的。
69 0
《剑指offer》题解——week2
|
存储 机器学习/深度学习 算法
《剑指offer》题解——week7
《剑指offer》题解——week7
57 0
《剑指offer》题解——week7
|
测试技术
【寒假每日一题】AcWing 4653. 数位排序(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 关于pair
95 0