一二三四五 上山打老虎

NC16438-回文日期

题目链接:https://ac.nowcoder.com/acm/problem/16438
给定两个日期a<b,求解在a到b中有多少个回文数,a和b格式为yyyymmdd,共8位。
思路1:裸暴力

#include<iostream>
using namespace std;
bool check(int x){
    int l=x/10000;
    int r=0;
    for(int i=0;i<4;i++){
        r=r*10+x%10;
        x/=10;
    }
    //cout<<l<<" "<<r<<endl;
    if(l==r)return true;
    return false;
}
int main (){
    int a,b;
    cin>>a>>b;
    int ans=0;
    for(int i=a;i<=b;){
        //cout<<i<<endl;
        if(check(i))ans++;
        int ad=i%100,am,ay;
        i/=100;
        am=i%100;
        i/=100;
        ay=i;

//    cout<<ay<<" "<<am<<" "<<ad<<endl;
        ad++;
        if(ad>=28){
        if(am==2){
            if((ay%4==0&&ay%100!=0)||ay%400==0){
                if(ad>29){
                    am++;
                    ad=1;
                }
            }
            else if(ad>28){
                    am++;
                    ad=1;
            }
        }
        else if(am==1||am==3||am==5||am==7||am==8||am==10||am==12){
            if(ad>31){
                    am++;
                    ad=1;
                }
        }
        else {
            if(ad>30){
                    am++;
                    ad=1;
                }
        }
        }
    if(am==13){
        am=1;
        ay++;
    }
    i=ay*10000+am*100+ad;
    }
    cout<<ans;
    return 0;
}

思路2:
遍历年判断生成的回文数满不满足条件 (也复杂点)

#include<iostream>

using namespace std;

int main (){
    int a,b;
    cin>>a>>b;
    int ans=0;
    for(int i=a/10000;i<=b/10000;i++){
        int t=i;
        int m=t%10;t/=10;
        m=m*10+t%10;
        t/=10;
        int d=t%10;t/=10;
        d=d*10+t%10;

        if(m>12||m<=0)continue;
        if(d>31||d<=0)continue;
        if(m==6||m==4||m==9||m==11)
            if(d>30)continue;
        if(m==2){
            if((i%4==0&&i%100!=0)||i%400==0){
                if(d>29)continue;
            }
            else if(d>28)continue;

        }
        int s=i*10000+m*100+d;
        if(s<a||s>b)continue;
        ans++;
        //cout<<i<<endl;
    }
    cout<<ans;
    return 0;
}

思路3:
遍历月和日,判断生成的年满不满足条件

待补充
posted @ 2021-01-19 20:42  黒川川  阅读(67)  评论(0)    收藏  举报