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. 日期差值(每日一题)
|
5月前
力扣每日一题 6/22 字符串/贪心
力扣每日一题 6/22 字符串/贪心
28 0
|
存储 算法 测试技术
【AcWing每日一题】4653. 数位排序
【AcWing每日一题】4653. 数位排序
116 0
|
人工智能 算法 测试技术
【AcWing每日一题】4655. 重新排序
【AcWing每日一题】4655. 重新排序
59 0
|
Java Python
leetcode每日一题.136:只出现一次的数字
leetcode每日一题.136:只出现一次的数字
55 0
【leetcode每日一题】1027. 最长等差数列
【leetcode每日一题】1027. 最长等差数列
|
Java 测试技术 C语言
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
|
C语言 Python
【蓝桥OJ——C语言】顺子日期、特殊时间、乘积尾零
2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。