求日期相关问题的重难点:

一.

(a) 目前使用的格里高利历闰年的规则如下:

  1. 公元年分非4的倍数,为平年。

  2. 公元年分为4的倍数但非100的倍数,为闰年。

  3. 公元年分为100的倍数但非400的倍数,为平年。

  4. 公元年分为400的倍数为闰年。

请用一个表达式判断某一年是否为闰年。

(b) 输入某一天的年月日,输出下一天的年月日。

(c) 输入某两天的年月日,输出这两天的相距多少天(不考虑公元前,且第一个日期比第二个日期要早)。

(d) 已知1970年1月1日是星期四,输入之后的某一天的年月日,判断它是星期几?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<malloc.h>

int main() {
	int year,month,day;
	int year1, month1,day1 ;
	int bj = 0,bj1=0;

	printf("请按如下格式输入年月日,“2012年2月28日”(包括相应的汉字也要输入)\n");
	printf("请保证输入年月日都为正数:\n");


	scanf("%d年%d月%d日", &year,&month,&day);
	scanf("%d年%d月%d日", &year1,&month1,&day1);


	if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
		if (day > 31) {
			printf("%d月的天数不能大于31天请检查后重新输入\n", month);
			return 0;
		}

	}
	if (month == 4 || month == 6 || month == 9 || month == 11) {
		if (day > 30) {
			printf("%d月的天数不能大于30天请检查后重新输入\n", month);
			return 0;
		}

	}
	if (month > 12) {
		printf("输入的月份值不能大于12,请重新输入\n");
		return 0;
	}


	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
		bj = 1;
	}


	if (bj == 0 && month == 2 && day > 28) {
		printf("%d年的%d月的天数不能大于28天请检查后重新输入\n", year, month);
		return 0;
	}
	if (bj == 1 && month == 2 && day > 29) {
		printf("%d年的%d月的天数不能大于29天请检查后重新输入\n", year, month);
		return 0;
	}


	if (month1 == 1 || month1 == 3 || month1 == 5 || month1 == 7 || month1 == 8 || month1 == 10 || month1 == 12) {
		if (day1 > 31) {
			printf("%d月的天数不能大于31天请检查后重新输入\n", month1);
			return 0;
		}

	}
	if (month1 == 4 || month1 == 6 || month1 == 9 || month1 == 11) {
		if (day1 > 30) {
			printf("%d月的天数不能大于30天请检查后重新输入\n", month1);
			return 0;
		}

	}
	if (month1 > 12) {
		printf("输入的月份值不能大于12,请重新输入\n");
		return 0;
	}


	if ((year1 % 4 == 0 && year1 % 100 != 0) || (year1 % 400 == 0)) {
		bj1 = 1;
	}


	if (bj1 == 0 && month1 == 2 && day1 > 28) {
		printf("%d年的%d月的天数不能大于28天请检查后重新输入\n", year, month);
		return 0;
	}
	if (bj1 == 1 && month1 == 2 && day1 > 29) {
		printf("%d年的%d月的天数不能大于29天请检查后重新输入\n", year, month);
		return 0;
	}


	//int Nry[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	//int ry[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
	int sumNry[13] = { 0,0,31,59,90,120,151,181,212,243,273,304,334 };
	int sumry[13] = { 0,0,31,60,91,121,152,182,213,244,274,305,335 };


///将1年1月1日作为公共的基准日期,找到两者对于基准日期的间隔日期进行相减即可。
	int xyday = 365 * (year - 1) + (year - 1) / 4 + (year - 1) / 400 - (year - 1) / 100;
	int xyday1= 365 * (year1 - 1) + (year1 - 1) / 4 + (year1 - 1) / 400 - (year1 - 1) / 100;

	int xmday, xmday1;
	if (bj == 1) {
		xmday = sumry[month];

	}
	else {
		xmday = sumNry[month];
		
	}

	if (bj1 == 1) {
		xmday1 = sumry[month1];
	}
	else {
		xmday1 = sumNry[month1];
	}

	int xdday = day;
	int xdday1 = day1;

	int xday = xdday + xmday + xyday;
	int xday1 = xdday1 + xmday1 + xyday1;
	int sum = (xday >= xday1) ? (xday - xday1) : (xday1 - xday);

	int whatday = (sum % 7)+1;
	//char cwhatday[7] = { '一','二','三','四','五','六','天' };
	//printf("当前输入的天数为星期%d\n", whatday);
	printf("输入的两个天数相差为%d天", sum);
	/*printf("%d", sum);
	*/
	//bool i = 0; 


	return 0;
}

     这道题的重难点在于 :你得找到一个基准起始日期,这个基准起始日期还得要方便计算与其相隔日期的天数就行了。

    当然这里还涉及一个问题,就是你把这个基准起始日期当做第一天,还是第零天的问题:就像是数组下标一样,不管数组下标是从1开始的,还是从0开始的,两个下标相隔的距离是不会改变的。与之相同的就是该题,你不管把基准起始日期当做第一天还是第0天,都是不会影响两个日期的相隔天数的。

讲真的这个间隔问题我是真的有点搞不明白,后面遇到了,就举小一点的例子来推吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值