每日OJ_牛客_美国节日(日期模拟)

目录

牛客_美国节日(日期模拟)

解析代码


牛客_美国节日(日期模拟)

美国节日__牛客网


解析代码

题目表述很明白,难点在于要求一个月第N个星期W。那么面对这个问题,拆解的思路是,首先,要想找到一个月第N个星期W,一定需要一个参照物,最好的目标当然是这个月的第一天。拿到参照物后,要能得到参照物的星期数,然后就能得到结果了。所以这个题有两个难点:

  • 判断某个月的1号到底是周几,
  • 然后根据这 星期数得到这个月第N个星期W。

这两个功能写成函数,即可通过反复调用拿到结果。

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;
bool isLeapYear(int y)
{
    return y % 400 == 0 || (y % 100 != 0 && y % 4 == 0);
}
int DAYS[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 求解 y,m,d 这一年过了多少天
int nDays(int y, int m, int d)
{
    int n = d;
    // m = 10
    // [1, 9]
    // [0, 8]
    for (int i = 0; i < m - 1; i++)
    {
        n += DAYS[i];
    }
    if (m > 2 && isLeapYear(y))
        n++;
    return n;
}
// 传入 y,m,d 计算从基准日期,到带计算日期过了多少天。
// 算出这个天数的 MOD 7 的同余数
int diff(int y, int m, int d)
{
    return (y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + nDays(y, m, d);
}
// 传入 y,m,d,计算周几
int week(int y, int m, int d)
{
    int w = diff(y, m, d) % 7;
    if (w == 0)
        w = 7;
    return w;
}
// 已知当月1日是星期 w,计算第 n 个星期 e 是几号
int m1(int w, int n, int e)
{
    return 1 + (n - 1) * 7 + (7 - w + e) % 7;
}
// 已知6月1日是星期w,计算5月的最后一个星期一
int m2(int w)
{
    int d = (w == 1 ? 7 : w - 1);
    return 32 - d;
}
int main()
{
    int y = 0;
    while (cin >> y)
    {
        printf("%d-01-01\n", y);
        int w = week(y, 1, 1);
        printf("%d-01-%02d\n", y, m1(w, 3, 1));
        w = week(y, 2, 1);
        printf("%d-02-%02d\n", y, m1(w, 3, 1));
        w = week(y, 6, 1);
        printf("%d-05-%02d\n", y, m2(w));
        printf("%d-07-04\n", y);
        w = week(y, 9, 1);
        printf("%d-09-%02d\n", y, m1(w, 1, 1));
        w = week(y, 11, 1);
        printf("%d-11-%02d\n", y, m1(w, 4, 4));
        printf("%d-12-25\n\n", y);
    }
}
相关推荐
a1879272183115 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记15 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
Logic10115 小时前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题
老赵的博客16 小时前
c++面试之从虚函数表到Rtti一次性讲清楚
c++·qt
Navigator_Z16 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode
wzdark16 小时前
基于链表的内存池设计与内存复用机制4
java·数据结构·链表
wzdark17 小时前
多维数组在算法设计中的存储映射问题4
算法
傲世仙尊17 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby17 小时前
C++11
开发语言·c++
Phil32317 小时前
多智能体不是越多越好:Google《Towards a Science of Scaling Agent Systems》论文深度解读
算法