题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。
【提示】
一个8位数字是回文的,当且仅当对于所有的i(1<i<8)从左向右数的第i个数字和第9-i个数字(即从右向左数的第i个数字)是相同的。
例如:
·对于2016年11月19日,用8位数字20161119表示,它不是回文的。
·对于2010年1月2日,用8位数字20100102表示,它是回文的。
·对于2010年10月2日,用8位数字20101002表示,它不是回文的。
每一年中都有12个月份: 其中,1, 3, 5, 7, 8, 10, 12月每个月有31天;4, 6, 9, 11月每个月有30天;而对于2月,闰年时有29天,平年时有28天。 一个年份是闰年当且仅当它满足下列两种情况其中的一种: 1.这个年份是4的整数倍,但不是100的整数倍; 2.这个年份是400的整数倍。
例如:
·以下几个年份都是闰年:2000 , 2012 , 2016。
·以下几个年份是平年:1900, 2011、2014。
输入
输入包括两行,每行包括一个8位数字。
第一行表示牛牛指定的起始日期dates,第二行表示牛牛指定的终止日期date2。保证dates和date:都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0;保证date一定不晚于date2。
输出
输出一行,包含一个整数,表示在date1和date2之间,有多少个日期是回文的。
样例输入
复制样例数据
20110101
20111231
样例输出
1
提示
对于样例1,符合条件的日期是20111102。
感觉这种模拟题我一直很弱。这个需要思路清晰,并且代码易看才是对的。不然容易错。
#include <iostream>
#include <cstdio>
using namespace std;
int hh[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//每个月的天数,二月单独判断
//判断是否是闰年;
bool is_runnian(int n){
if((n%4==0&&n%100!=0)||n%400==0) return true;
return false;
}
//这个函数用来找此年此月多少天
int fun(int year,int month){
if(month==2){
if(is_runnian(year)){
return 29;
}
else return 28;
}
else
return hh[month];
}
int main()
{
int n,m,i;
int ans=0;
cin>>n>>m;
int a=n/10000,b=m/10000;
int date;
for(i=a;i<=b;i++){
//date表示此年的回文数
date=i*10000+i%10*1000+i%100/10*100+i%1000/100*10+i/1000;
//如果满足这个数位于输入两个数之间,月份位于1-12,月份对应的天数没有超过范围 if(date>=n&&date<=m&&date%10000/100>0&&date%10000/100<=12&&date%100<=fun(i,date%10000/100)){
ans++;//答案++;
}
}
cout<<ans<<endl;
return 0;
}