题目:
日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
小明习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月份,最后22位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
小明认为,一个日期是回文的,当且仅当表示这个日期的88位数字是回文的。现在,小明想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期。
思路:
每一年中都有12个月份:
其中,11,33,55,77,88,1010,1212月每个月有3131天;44,66,99,1111月每个月有3030天;而对于22月,闰年时有2929天,平年时有2828天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:
1.这个年份是44的整数倍,但不是100100的整数倍;
2.这个年份是400400的整数倍。
例如:
·以下几个年份都是闰年:20002000 ,20122012 ,20162016
·以下几个年份是平年:19001900,20112011,2014
最后,上代码!!!
#include<bits/stdc++.h>
using namespace std;
bool check_date(int date)
{
int rs[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n=date/10000;
int y=date%10000/100;
int r=date%100;
if(y==0||y>12)
{
return false;
}
if(r==0||y!=2&&r>rs[y])
{
return false;
}
if(y==2)
{
int leap=n%100!=0&&n%4==0||n%400==0;
if(r>28+leap)
{
return false;
}
}
}
int main()
{
int sum=0;
int date1,date2;
cin>>date1>>date2;
for(int i=date1;i<=date2;i++)
{
if(check_date(i))
{
sum++;
}
}
cout<<sum;
}
运行结果