计算两个日期间的回文日期的个数

  • Post author:
  • Post category:其他


日常生活中,通过年月日三个要素可以表示出一个唯一确定的日期。

我们可以用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 版权协议,转载请附上原文出处链接和本声明。