DreamJudge-1011-日期

DawnTraveler發表於2024-06-10

1.題目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

今天是2012年4月12日星期四,編寫程式,輸入今天開始到12月31日之間的任意日期,輸出那一天是星期幾。例如輸入“5(回車)20(回車)”(5月20日),輸出應為“Sunday”。

輸入輸出格式

輸入描述:

輸入第一行為月份。
輸入第二行為這個月的第幾天。

輸出描述:

輸入這一天是星期幾。
輸入輸出樣例

輸入樣例#:

5
20

輸出樣例#:

Sunday

題目來源

貴州大學機試題

2.題解

2.1 打表 + 日期計算

思路

1.對於每月可能的日期 和 星期數 均進行打表操作,後續便於操作;
2.兩個日期之間差的天數計算: diff_d = f[4] - base_d - (f[cur_m] - cur_d);
我是這樣思考的,如果是類似4.12 -> 6.08 這樣的日期:
我們選擇忽略計算四月份的剩餘日期(後面i = 1開始計算的),將這段日期補到五月份中;
f[4] - base_d 相當於四月份多的日期, f[cur_m] - cur_d 相當於當前月缺少的日期(我們f[]計算的是整月一共有的總日期數31,30,29,28這種)
如果能補全,這個結果相當於就是正的;反之為負數,這樣就將這些零碎日期計算完畢,之後為計算結果進行補缺!

計算出 diff_d = 30 - 12 - (30 - 8) = -4;
然後開始使用迴圈,將5月和6月的日期均計算進去, diff_d = -4 + 31 + 30 = 57 天,這樣就計算出了兩段日期差

  1. 計算具體星期數,這個比較簡單,直接使用 weeks[(base_week + diff_d) % 7] 中 % 即可完美解決迴圈問題!

  2. 且這樣計算擴充性較好,如果具體起始日期不是4.12,只要更新base_m和base_d即可

程式碼

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int> f{0,31,28,31,30,31,30,31,31,30,31,30,31};
	vector<string> weeks{"Sunday", "Monday", "TuesDay", "Wednesday", "Thursday", "Friday", "Saturday"};
	int base_m = 4, base_d = 12;
	int base_week = 4;
	int cur_m, cur_d;
	cin >> cur_m >> cur_d;
	
	int diff_m = cur_m - base_m;
	int diff_d = f[base_m] - base_d - (f[cur_m] - cur_d);	
	for(int i = 1; i <= diff_m; i++){
		diff_d += f[base_m + i];
	}
	
	string weekday = weeks[(base_week + diff_d) % 7];
	cout << weekday;
	return 0;
}

相關文章