PAT--算法笔记3.4-日期差值(计算两个日期相差多少天)-code up 1928

关于闰年

1、公历中只分闰年和平年,平年二月28天,闰年二月29天,平年有365天,闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31,30天,31天,30天,31天)。

2、普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);

     世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);

     四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,2100年则是平年。

提交地址

https://www.nowcoder.com/questionTerminal/ccb7383c76fc48d2bbc27a2a6319631c

思路

一、最粗暴的方法:一天一天的累加。

//一天一天的累加
#include <stdio.h>
int month[2][15]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};   //闰年、平年每个月份对应的日期

int judge (int a) {
    if ((a%4==0&&a%100!=0)||a%400==0) return 1;   //闰年返回1
	else return 0;
}      //判断是平年还是闰年

int main()
{
    int a1, a2, year1, year2, month1, month2, day1, day2;
	int temp, sum=0;       //sum标记差多少天
	scanf("%d %d", &a1, &a2);     //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
	if (a1>a2) {
	    temp=a1;
		a1=a2;
		a2=temp;
	}              //保证a1在前,a2在后。还有一种做法是让当前日期与0年1月1日比较,两个结果做差取绝对值
	year1=a1/10000; month1=a1%10000/100; day1=a1%100;     //20130127转化为2013 01 27
	year2=a2/10000; month2=a2%10000/100; day2=a2%100;
	//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2);    //测试代码
	
	while(year1!=year2 || month1!=month2 || day1!=day2) {
		if (day1<month[judge(year1)][month1]) day1++;    //day1没满当月天数,day1加一天
		else {
			if (month1<12){      //月份没达到12,月份加一
			    day1=1;
				month1++;
			}else {          //月份达到12,年加一
				year1++;
				month1=1;
				day1=1;
			}
		}
		sum++;   //每循环一次,两个日期差值加一
		//printf("%d %2d %2d %2d\n", year1, month1, day1, sum);   //测试代码
	}

	//printf("%d\n", month[0][1]);     //测试代码
	printf("%d\n", ++sum);         
}

二、先一年一年的加,再逐天累加。

//先一年一年的加,再逐天累加
#include <stdio.h>
int month[2][15]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};   //闰年、平年每个月份对应的日期

int judge (int a) {
    if ((a%4==0&&a%100!=0)||a%400==0) return 1;   //闰年返回1
	else return 0;
}      //函数作用:判断是平年还是闰年

int main()
{
    int a1, a2, year1, year2, month1, month2, day1, day2;
	int temp, sum=0;       //sum标记相差多少天
	scanf("%d %d", &a1, &a2);     //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
	if (a1>a2) {
	    temp=a1;
		a1=a2;
		a2=temp;
	}              //保证a1在前,a2在后 
	year1=a1/10000; month1=a1%10000/100; day1=a1%100;     //20130127转化为2013 01 27
	year2=a2/10000; month2=a2%10000/100; day2=a2%100;
	//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2);          //测试代码
	
	while(year1<year2) {
		if (a1%10000<=228) {       //如果是2.28之前月份,总天数加多少取决于year1。注:此处不能写0228,不然会认为是8进制的数
		    if(judge(year1)==1) sum+=366;
			else sum+=365;
		}else {                     //如果是2.28之后月份,总天数加多少取决于year1+1
		    if(judge(year1+1)==1) sum+=366;
			else sum+=365;
		}
		year1++;
	}    //将两个日期的年份统一
	
	if(a1%10000<=a2%10000) {                        //将a1的年份拉至与a2的年份相同后,a1的日期在a2的前面
		while(month1!=month2 || day1!=day2) {          //a1的日期一天一天的累加,直到等于a2,此时总天数逐渐增加
			if (day1<month[judge(year1)][month1]) {
			    day1++;
				sum++;
			}else {         //日期累加到月底后,月份加1,日变为1号
			    month1++;
				day1=1;
				sum++;
			}
		}
	}else {                                        //将a1的年份拉至与a2的年份相同后,a1的日期在a2的后面
		while(month1!=month2 || day1!=day2) {         //a2的日期一天一天的累加,直到等于a1,此时总天数逐渐减少
			if (day2<month[judge(year1)][month2]) {
			    day2++;
				sum--;
			}else {
			    month2++;
				day2=1;
				sum--;
			}
		}
	}
	//printf("%d\n", month[0][1]);     //测试代码
	printf("%d\n", ++sum);          //测试代码
}

三、计算两个日期与0年1月1日得差值,两个值再做差。

#include <stdio.h>
int month[2][15]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};   //闰年、平年每个月份对应的日期
int year[5]={365,366};

int judge (int a) {
    if ((a%4==0&&a%100!=0)||a%400==0) return 1;   //闰年返回1
	else return 0;
}      //判断是平年还是闰年

int gap(int a, int b, int c) {
    int i, sum=0;
	for (i=0; i<a; i++) sum+=year[judge(i)];  //a年的前一年到0年的天数
	for (i=1; i<b; i++) sum+=month[judge(a)][i];
	sum+=c;
	return sum;
}    //计算a年b月c日到0年1月1日的天数

int main()
{
    int a1, a2, year1, year2, month1, month2, day1, day2;
	int temp, sum=0;       //sum标记差多少天
	scanf("%d %d", &a1, &a2);     //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
	if (a1>a2) {
	    temp=a1;
		a1=a2;
		a2=temp;
	}              //保证a1在前,a2在后
	year1=a1/10000; month1=a1%10000/100; day1=a1%100;     //20130127转化为2013 01 27
	year2=a2/10000; month2=a2%10000/100; day2=a2%100;
	//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2);    //测试代码
	
	sum=gap(year2, month2, day2)-gap(year1, month1, day1);   //两个距离做差
	printf("%d\n", ++sum);         
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值