New to OI, hope dalao will help

P2010 [NOIP2016 普及组] 回文日期

syanoeclipse @ 2021-10-13 20:59:32

代码见二楼

评测


by syanoeclipse @ 2021-10-13 20:59:50

#include <iostream>
using namespace std;
bool leapyear(int x)
{
    int y=x/10000;
    if(x%400==0){return true;}
    if(x%100==0){return false;}
    if(x%4==0){return true;}
    return false;
}
bool fullday(int x)
{
    int m=(x/100)%100;
    int d=x%100;
    switch(m)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return (d==31);
        case 4:
        case 6:
        case 9:
        case 11:
            return (d==30);
        case 2:
            return ((leapyear(x) and d==29) or (!leapyear(x) and d==28));
    }
}
bool fullmonth(int x)
{
    int m=(x/100)%100;
    return (m==12);
}
int nextdate(int x)
{
    int y=x/10000;
    int m=(x/100)%100;
    int d=x%100;
    if(fullday(x))
    {
        if(fullmonth(x))
        {
            y+=1;
            m=1;
            d=1;
        }
        else
        {
            m+=1;
            d=1;
        }
    }
    else
    {
        d+=1;
    }
    return (10000*y + 100*m + d);
}
bool reverse(int x)
{
    bool ra=(x/10000000)==(x%10);
    bool rb=(x/1000000)%10==(x%100)/10;
    bool rc=(x/100000)%10==(x%1000)/100;
    bool rd=(x/10000)%10==(x%10000)/1000;
    return ra and rb and rc and rd;
}
int main()
{
    int a,b,ans=0;
    cin>>a>>b;
    for(int i=a;i<=b;i=nextdate(i))
    {
        if(reverse(i))
        {
            ans++;
        }
    }
    cout<<ans;
    return 0;
}

by Trafford1894 @ 2021-10-13 21:06:18

其实这题有简便思路,就是求出所有回文日期,再判断是否在题目范围之内。


by syanoeclipse @ 2021-10-13 21:07:56

@Panchromium ,这也行


by Comintern @ 2021-10-13 21:13:48

@开普勒的梦

bool leapyear(int x)
{
    int y=x/10000;
    if(y%400==0){return true;}
    if(y%100==0){return false;}
    if(y%4==0){return true;}
    return false;
}

这里x要改成年份(y)


by ckk11288 @ 2021-10-13 21:28:12

我只有个超级暴力的考场代码,你可以看看


//date暴力做法,思路比较好懂 
#include<bits/stdc++.h>
using namespace std;
bool run(int d)//闰年判断 
{
    d=d/10000;//d/10000为年份 
    if(d%4==0)
    {
        if(d%100==0)
        {
            if(d%400==0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
}
bool check(int n)//判断日期是否存在 
{
    if(n/100%100>12||n%100>31)//月份超过12,日期超过31直接返回false 
    {
        return false;
    }
    else//判断月份对应的日期是否符合要求,n/100%100为月份,n%100为日期 
    {
        if(n/100%100==1||n/100%100==3||n/100%100==5||n/100%100==7||n/100%100==8||n/100%100==10||n/100%100==12)
        {
            if(n%100<=31)
            {
                return true;
            }
            else return false;
        }
        if(n/100%100==4||n/100%100==6||n/100%100==9||n/100%100==11)
        {
            if(n%100<=30)
            {
                return true;
            }
            else return false;
        }
        if(n/100%100==2)//特判2月 
        {
            if(run(n))//如果该年份为闰年 
            {
                if(n%100<=29)//二月上限为29 
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else//如果不是闰年 
            {
                if(n%100<=28)//二月上限为28
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }

}
bool huiwen(int f)//判断回文 
{
    int sum=0,xum=f;
    while(f>0)//数字反转思路 
    {
        sum=sum*10+f%10;
        f/=10;
    }
    if(sum==xum)//如果反转前后值相等,返回true 
    {
        return true;
    }
    else//不相等,返回false 
    {
        return false;
    }
}
int main()
{
    //freopen("date.in","r",stdin);
    //freopen("date.out","w",stdout);考试时把“//”删掉 
    int i,n,m,c=0;
    cin>>n>>m;
    for(i=n;i<=m;i++)
    {
        if(check(i)&&huiwen(i))//枚举,符合要求就结果+1 
        {
            c++;
        }
    }
    cout<<c<<endl;
    return 0;
}

by Mr_Terminator @ 2021-10-13 21:30:34

艹还以为是神贴


by syanoeclipse @ 2021-10-13 21:38:41

@幽灵2 哪那么多神贴


|