题解 | #[NOIP2016]回文日期#

[NOIP2016]回文日期

https://ac.nowcoder.com/acm/problem/16438

思路:从第一个日期年份开始枚举到第二个日期的年份,即for(int i=a/10000;i<=b/10000;i++);然后判断这一年当中是否存在一个日期是和年份互为回文数。

```#include <bits/stdc++.h>
using namespace std;
int a,b;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void checkyear(int n)//判断二月份有几天,是否闰年
{
    if((n%4==0&&n%100!=0)||n%400==0)
        month[2]=29;
    else month[2]=28;
}
int hw(int n)//求月份和日期的回文数
{
    int s=0;
    while(n!=0)
    {
        s=s*10+n%10;
        n/=10;
    }
    return s;
}
int main()
{
    cin>>a>>b;
    int cnt=0;
    for(int i=a/10000;i<=b/10000;i++)
    {
        checkyear(i);
        int m=hw(i%100);//求月份的回文数
        if(i%100<10)m*=10;//如果年份后两位是01到09,进过回文函数处理之后还是1到9
        //所以这里要乘于10;年份第一位一定不为0,日期不用处理
        int d=hw(i/100);
        if(m>0&&m<=12&&d>0&&d<=month[m])//判断月份和日期是否满足
        {
            int f=i*10000+m*100+d;//这两行判断8位数的日期是否是在输入的两个日期之间
            if(f>=a&&f<=b)
            {
                cnt++;
            }
        }
    }
    cout<<cnt;
}
全部评论

相关推荐

点赞 评论 收藏
分享
杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务