日期类问题----机试自学手记(2)

日期类问题

文章根据王道机试书进行学习。

闰年的判断规则

当年数不能被100整除时若其能被4整除则为闰年,或者其能被400整除也为闰年,闰年二月29天,平年二月28天
Year%100!=0 &&Year%4==0 ||Year%400==0

日期差值问题

问题描述:
有两个日期,求两个日期之间的天数,如果两个日期时连续的我们规定他们之间的天数为两天。
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

示例代码:
(思想是把问题统一到与原点日期0000年1月1日时间差的计算上)

#include <stdio.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
//定义宏判断是否闰年
int dayOfMonth[13][2]={
0,0, 
31,31, 
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31} ;
struct Data{
	int Day;
	int Month;
	int Year;
	void nextDay(){
		Day++;
		if(Day>dayOfMonth[Month][ISYEAP(Year)]){
			Day=1;
			Month++;
			if(Month>12){
				Month=1;
				Year++;
			}
		}
	}
};

int buf[5001][13][32];//保存预处理的天数
int Abs(int x){
	return x<0?-x:x;
} 
int main(){
	Data tmp;
	int cnt=0;
	tmp.Day=1;
	tmp.Month=1;
	tmp.Year=0;
	while(tmp.Year!=5001){
		buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
		tmp.nextDay();
		cnt++;
	} 
	int d1,m1,y1;
	int d2,m2,y2;
	while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){
		scanf("%4d%2d%2d",&y2,&m2,&d2);
		printf("%d\n",Abs((buf[y2][m2][d2]-buf[y1][m1][d1]))+1);
	}
	return 0;
}

星期几判断问题

样例输入:
9 October 2001
14 October 2001
样例输出:
Tuesday
Sunday
示例代码:

#include <stdio.h>
#include <string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
int dayOfMonth[13][2]={
0,0,
31,31,
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31};
struct Data{
	int Day;
	int Month;
	int Year;
	void nextDay(){
		Day++;
		if(Day>dayOfMonth[Month][ISYEAP(Year)]){
			Day=1;
			Month++;
			if(Month>12){
				Month=1;
				Year++;
			}
		}
	} 
};
int buf[5001][13][32];
char monthName[13][20]={
"",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
char weekName[7][20]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int main(){
	Data tmp;
	int cnt=0;
	tmp.Day=1;
	tmp.Month=1;
	tmp.Year=0;
	while(tmp.Year!=5001){
		buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
		tmp.nextDay();
		cnt++;
	}
	int d,m,y;
	char s[20];
	while(scanf("%d%s%d",&d,s,&y)!=EOF){
		for(m=1;m<=12;m++){
			if(strcmp(s,monthName[m])==0){
				break;
			}
		}
		int days=buf[y][m][d]-buf[2019][7][12];//2019年7月12日是周五
		days+=5;//周五下标是5
		printf("%s\n",weekName[(days%7+7)%7]);
	}
	return 0;
} 

总结

宏定义的函数形式如:#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
strcmp()字符串比较,当为0时候表示相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值