ACM-日曆問題

問題描述

        在我們現在使用的日曆中, 閏年被定義爲能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年是例外,它們不是閏年。例如: 1700, 1800, 1900 和 2100 不是閏年,而 1600, 2000 和 2400 是閏年。 給定從公元 2000 年 1 月 1 日開始逝去的天數,你的任務是給出這一天是哪年哪月哪日星期幾。

輸入數據

        輸入包含若干行,每行包含一個正整數,表示從 2000 年 1 月 1 日開始逝去的天數。輸入最後一行是−1, 不必處理。可以假設結果的年份不會超過 9999。

輸出要求

        對每個測試樣例, 輸出一行, 該行包含對應的日期和星期幾。格式爲“YYYY-MM-DD DayOfWeek”, 其 中 “DayOfWeek” 必 須 是 下 面 中 的 一 個 : "Sunday", "Monday","Tuesday", "Wednesday","Thursday","Friday"and"Saturday“。

輸入樣例

1730
1740
1750
1751
-1

輸出樣例

2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday

解題思路

        根據題目要求,所有涉及的數值都是用整數可以表示的。這個問題可以分解成兩個彼此獨立的問題:一個是要求的那天是星期幾,另一是要求的那天是哪年哪月那天。第一個問題比較簡單,知道 2000 年 1 月 1 日是星期幾後,只要用給定的日期對 7 取模,就可以知道要求的一天是星期幾。第二個問題相對麻煩一些。我們用 year, month, date 分別表示要求的日期的年、月、日。當輸入一個整數 n 時,如果 n 大於等於一年的天數,就用 n 減去一年的天數,直到 n 比一年的天數少(這時假設剩下天數爲 m),一共減去多少年 year 就等於多少;如果 m 大於等於一個月的天數,就用 m 減去一個月的天數,直到 m 比一個月的天數少(這時假設剩下的天數爲 k) ,一共減去多少個月 month 就等於多少;這時 k 爲從當月開始逝去的天數, k+1 就是要求的 date。這裏減去一年的天數時要判斷當年是否是閏年,減去一月時要判斷當月有幾天。

參考程序

#include <iostream>
#include <cstdio>
using namespace std;
int type(int m);
char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
int year[2]={365,366}; //year[0]表示非閏年的天數, year[1]表示閏年的天數。
int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};
//month[0]表示非閏年裏每個月的天數, month[1]表示閏年裏每個月的天數。
int main()
{
	int days,dayofweek;//days 表示輸入的天數, dayofweek 表示星期幾。
	int i=0,j=0;
	while(cin>>days){
		if(days == -1){
			break;
		}
		dayofweek = days % 7; //計算星期
		//計算年份,每次都減去對應年份天數 
		for(i=2000;days>=year[type(i)];i++){
			days-=year[type(i)];
		}
		//計算月份,每次都減去對應月份天數 
		for(j=0;days>=month[type(i)][j];j++){
			days -= month[type(i)][j];
		}
		printf("%d-%02d-%02d %s\n",i,j+1,days+1,week[dayofweek]);
	}
	return 0;
}
//判斷第 m 年是否是閏年,是則返回 1,否則返回 0。
int type(int m){
	if(m % 4 != 0 || (m %100==0 && m%400 != 0)){
		return 0;
	}
	return 1;
}

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