|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用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天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:
这个年份是4的整数倍,但不是100的整数倍;
这个年份是400的整数倍。
例如:
以下几个年份都是闰年:2000,2012,2016。
以下几个年份是平年:1900,2011,2014。
输入描述
两行,每行包括一个8位数字。
第一行表示牛牛指定的起始日期date1
。
第二行表示牛牛指定的终止日期date2
。
题目数据保证:
date1
—定不晚于 date2
;
都是真实存在的日期;
年份部分一定为4位数字;
首位数字不为0;
输出描述
一个整数,表示在date1
和date2
之间,有多少个日期是回文的。
样例
输入 复制
20110101
20111231
输出 复制
1
输入 复制
20000101
20101231
输出 复制
2
我的代码如下:
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool hefa(int date)
{
int year=date/10000;
int mon=date/100%100;
int day=date%100;
if(mon==0||mon>12)
return false;
if(day==0||mon!=2&&day>days[mon])
return false;
if(mon==2)
{
int leap=year%100!=0&&year%4==0||year%400==0;
if(day>28+leap)
{
return false;
}
}
}
int main()
{
int date1,date2;
cin>>date1;
cin>>date2;
int i,count=0,sum=0;
for(i=1000;i<10000;i++)
{
int date=i,x=i;
while(i)
{
sum=sum*10+i%10;
i=i/10;
}
if(date1<=date2&&date<=date2&&hefa(date))
{
count++;
}
}
cout<<count<<endl;
}
哪里不对啊请问 |
|