回文日期
链接:https://ac.nowcoder.com/acm/problem/16438
来源:牛客网
对于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位数字。
第一行表示牛牛指定的起始日期。
第二行表示牛牛指定的终止日期。
保证date都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0。
输出描述:
输出一行,包含一个整数,有多少个日期是回文的。
思路:
从起始日期到终止日期遍历,判断其回文过来的日期是否合理,当year是闰年且是二月时,需要特判;
代码:
#include<stdio.h>
int m[13]={0,31,30,31,30,31,30,31,31,30,31,30,31};
int leap(int y)
{
return y%4==0&&y%100!=0||y%400==0;
}
int main()
{
int bd,ed;
scanf("%8d%8d",&bd,&ed);
int ans=0;
int by=bd/10000,ey=ed/10000;
for(int i=by;i<=ey;i++)
{
int q=0,w=i;
for(int j=0;j<4;j++)
{
q=q*10+w%10;
w/=10;
}
int mon=q/100,day=q%100;
if(mon>=1&&mon<=12&&day>=1&&day<=m[mon])
{
if(leap(i)&&day>29&&mon==2)
;
else
ans++;
}
}
printf("%d\n",ans);
}
浙公网安备 33010602011771号