f709: 12019 - Doom's Day Algorithm

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

CPE 一顆星選集 49 道必考題

題目連結:https://zerojudge.tw/ShowProblem?problemid=f709

內容

假設年分為 2011。
給定日期,求出那天星期幾。

輸入第一列 T (T <= 100)代表測資數,接著有 T 列 月份和星期。

範例輸入

9
1 6
2 28
4 5
5 26
8 1
11 1
12 25
12 31
3 9

範例輸出

Thursday
Monday
Tuesday
Thursday
Monday
Tuesday
Sunday
Saturday
Wednesday

想法

使用一個陣列紀錄每個月分別有幾天,再用一個二維陣列紀錄該月該天星期幾,從 1/1 跑到 12/31,過程中更新此二維陣列之數值。像是 week[10][16] = 5 代表 10/16 為星期五。

此陣列存取的資料為整數,需另外用一個字串陣列轉換。

程式碼

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

int main(){
fastio;
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int week[13][32], c = 6;
string s[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
memset(week, 0, sizeof(week));
for(int i = 1; i <= 12; ++i){
for(int j = 1; j <= month[i-1]; ++j){
week[i][j] = c;
c = c%7 + 1;
}
}
int T, M, D, temp;
cin >> T;
while(T--){
cin >> M >> D;
temp = week[M][D];
cout << s[temp-1] << "\n";
}
return 0;
}