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

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

我们可以用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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值