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 天,這樣就計算出了兩段日期差
-
計算具體星期數,這個比較簡單,直接使用 weeks[(base_week + diff_d) % 7] 中 % 即可完美解決迴圈問題!
-
且這樣計算擴充性較好,如果具體起始日期不是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;
}