DreamJudge-1011-日期
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;
}