题解 | #[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;
}