文章

3

粉丝

74

获赞

3

访问

2.0k

头像
日期 题解:
P1011 贵州大学机试题
发布于2024年6月10日 22:17
阅读数 713

##打表 + 日期计算
### 思路
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 天,这样就计算出了两段日期差

3. 计算具体星期数,这个比较简单,直接使用 weeks[(base_week + diff_d) % 7] 中 % 即可完美解决循环问题!

4. 且这样计算拓展性较好,如果具体起始日期不是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_...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发