日期類問題----機試自學手記(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時候表示相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章