回文日期

题目 回文日期

image-ecb66fd4

思路分析

枚举每个数 取出合法日期 再对合法日期进行判断

判断是否回文可以用字符串 翻转比较

比如12344321 复制一份 翻转一下12344321 s1=s2

123231 复制一份 翻转一下 132321 s1≠s2

#include<bits/stdc++.h>

using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool is_leap(int year){

    return year%100 && year%4==0 || year%400==0;

}

bool check_date(int year,int month,int day)

{

    if(month==0 || month>12)    return false;

    if(day==0 || day>31)    return false;

    int cur_day=days[month];

    if(month==2 && is_leap(year))

        cur_day++;

    if(day>cur_day)

        return false;

    return true;

}

int main()

{

    int stdate,eddate;

    cin>>stdate>>eddate;

    int cnt=0;

    for(int date=stdate;date<=eddate;date++){

        int year=date/10000,month=date%10000/100,day=date%100;

        if(check_date(year,month,day)){

            string s1=to_string(date);

            string s2=s1;

            reverse(s2.begin(),s2.end());

            if(s1==s2)

                cnt++;

        }

    }

    cout<<cnt;

    return 0;

}
image-38e36b13

居然超时了 来听一下y总怎么写 感觉这个已经很巧妙了啊

时间主要是浪费在了枚举合法日期上

可以换个枚举顺序 先枚举可能的回文串 再检查它是否是合法日期

yyyymmdd 要让它回文 意味着mmdd要等于yyyy 这意味着 如果确定了yyyy 就可以确定mmdd

所以枚举年份即可 构造相应的回文日期 然后再判断这个日期是否合法

妙上加妙

代码实现

#include<bits/stdc++.h>

using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool is_leap(int year){

    return year%100 && year%4==0 || year%400==0;

}

bool check_date(int year,int month,int day)

{

    if(month==0 || month>12)    return false;

    if(day==0 || day>31)    return false;

    int cur_day=days[month];

    if(month==2 && is_leap(year))

        cur_day++;

    if(day>cur_day)

        return false;

    return true;

}

int main()

{

    int stdate,eddate;

    cin>>stdate>>eddate;

    int cnt=0;

    for(int year=stdate/10000;year<=eddate/10000;year++){

        string left=to_string(year);

        string right=left;

        reverse(right.begin(),right.end());

        // string yearstr=left+right;

        int month=stoi(right.substr(0,2));

        int day=stoi(right.substr(2,2));

        int date=year*10000+month*100+day;

        if(date>=stdate && date<=eddate)

            if(check_date(year,month,day))

                cnt++;

    }

    cout<<cnt;

    return 0;

}

同类题型

视频讲解


⬅️ 日期问题 🏠 00-刷题理模型 ➡️ 回文日期2