日常生活中,通过年月日三个要素可以表示出一个唯一确定的日期。
我们可以用8位数字表示一个日期,前四位代表年份,接下来2位代表月份,2位代表日期
显然:一个星期表示方法是唯一的
我们可以认为,一个日期是回文的,当且仅当表示这个日期的8位数字回文
现想求出给定两个日期之间(包括两个日期本身),有多少个真实存在的日期是回文的。
一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8) 从左向右数的第 i 个数字和第9−i 个数字(即从右向左数的第 i 个数字)是相同的。
例如:
2016年11月19日,8位数字表示为20161119,它不是回文的。
2010年1月2日,8位数字表示为20100102,它是回文的。
(闰年的判断条件为要么是4的倍数且不是100的倍数,要么是400的倍数)
输入格式:
输入包括两行,每行包括一个 8 位数字。
第一行表示起始日期date1,第二行表示终止日期date2。
已保证date1和date2真实存在,且年份一定为4位数字,且首位不为0,且date1一定不晚于date2
输出格式:
输出共一行,包含一个整数,表示在 date1 和 date2 之间,有多少个日期是回文的。
输入样例:
20110101
20111231
输出样例:
1
解答:
#include <stdio.h>
int panduan(int date)
{
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int year=date/10000;
int mouth=date/100%100;
int day=date%100;
int a;
if(mouth!=2&&day>days[mouth]||mouth<0||mouth>12||day==0)return 0;
if(mouth==2)
{
if(year%400==0)a=1;
else
{
if(year%4==0&&year%100!=0)a=1;
else a=0;
}
if(day>days[mouth]+a)return 0;
}
return 1;//判断是否满足是8位数的日期
}
int main()
{
int date1,date2,sum=0,i,j,k,date;
scanf("%d%d",&date1,&date2);
for(i=1000;i<10000;i++)
{
date=i;k=i;
for(j=0;j<4;j++)
{
date=date*10+k%10;
k/=10;
}
if(date>=date1&&date<=date2&&panduan(date)==1)sum++;//判断日期是否满足
}
printf("%d",sum);
}
版权声明:本文为Taciturnity_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。