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 天,这样就计算出了两段日期差

  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;
}
posted @ 2024-06-10 22:23  DawnTraveler  阅读(4)  评论(0编辑  收藏  举报