日期類問題

日期類問題方法

預處理:在程序真正開始輸入數據之前,先將所有日期與原點日期之間的天數差保存起來,之後直接調用即可

例1:九度1096

題目描述:

有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數爲兩天

輸入:

有多組數據,每組數據有兩行,分別表示兩個日期,形式爲YYYYMMDD

輸出:

每組數據輸出一行,即日期差值

樣例輸入:

20110412 
20110422

樣例輸出:

11

#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 Date{
	int Year;
	int Month;
	int Day;
	void nextday(){
		Day++;
		if(Day>dayOfMonth[Month][ISYEAP(Year)])
		{
			Day=1;
			Month++;
			if(Month>12)
			{
				Month=1;
				Year++;
			}
		}
	}
}; //不要忘記逗號!
int abs(int a){return a>0?a:-a;} //求絕對值函數
int buf[5001][13][32]; //由於該變量需要大量空間,故需要定義成全局變量或者在函數中使用malloc動態申請變量空間
int main(int argc, char* argv[])
{
	Date tmp;
	int count=0; //記錄天數
	tmp.Day=1;
	tmp.Month=1;
	tmp.Year=0;
	while(tmp.Year!=5001)  //初始化每一天與0.1.1的日期差
	{
		buf[tmp.Year][tmp.Month][tmp.Day]=count;
		tmp.nextday();
		count++;
	}

	//下面就是根據題目要求的
	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[y1][m1][d1]-buf[y2][m2][d2])+1);
	}
	return 0;
}
例2:九度1043

題目描述:

We now use the Gregorian style of dating in Russia. The leap years are years with number divisible by 4 but not divisible by 100, or divisible by 400.
For example, years 2004, 2180 and 2400 are leap. Years 2004, 2181 and 2300 are not leap.
Your task is to write a program which will compute the day of week corresponding to a given date in the nearest past or in the future using today’s agreement about dating.

輸入:

There is one single line contains the day number d, month name M and year number y(1000≤y≤3000). The month name is the corresponding English name starting from the capital letter.

輸出:

Output a single line with the English name of the day of week corresponding to the date, starting from the capital letter. All other letters must be in lower case.

樣例輸入:
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 //注意此處的宏定義寫法!!

//定義每月天數,0空出來,1-12分別對應1月-12月
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 Date{
	int Year;
	int Month;
	int Day;
	void nextday(){
		Day++;
		if(Day>dayOfMonth[Month][ISYEAP(Year)])
		{
			Day=1;
			Month++;
			if(Month>12)
			{
				Month=1;
				Year++;
			}
		}
	}
};

//定義月份名稱,0空出去,1-12分別對應一月到12月
char monthName[13][20]={
	"",
	"January",
	"February",
	"March",
	"April",
	"May",
	"Jun",
	"July",
	"August",
	"September",
	"October",
	"November",
	"December"
};

//定義星期名稱,注意!0-6分別表示週日到週六!與下面對7求餘對應
char weekName[7][20]={
	"Sunday",
	"Monday",
	"Tuesday",
	"Wednesday",
	"Thursday",
	"Friday",
	"Saturday"
};

//定義buf變量來存儲每天的天數
int buf[5001][13][32];
int main(int argc, char* argv[])
{
	//初始化Date
	Date tmp;
	tmp.Year=0;
	tmp.Month=1;
	tmp.Day=1;
	int count=0;
	while(tmp.Year!=5001)
	{
		buf[tmp.Year][tmp.Month][tmp.Day]=count;
		tmp.nextday();
		count++;
	}
	//以下爲題目程序部分
	int day;
	char m[20];
	int month;
	int year;
	while(scanf("%d %s %d",&day,m,&year)!=EOF)
	{
		int i;
		for(i=0;i<13;i++) //得出月份數字
		{
			if(strcmp(m,monthName[i])==0)
			{
				month=i;
			}
		}
		int  days=buf[year][month][day]-buf[2018][1][28]; //計算與某一已知週一的日期差,可能有負數
		printf("%s\n",weekName[(days%7+7)%7]); //保證星期爲非負數
	//	puts(weekName[(days%7+7)%7]);
	}
	return 0;
}



發佈了39 篇原創文章 · 獲贊 3 · 訪問量 5283
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章