回文日期

链接: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);
}

posted @ 2021-05-23 21:16  废柴废柴少女  阅读(132)  评论(0)    收藏  举报