数据结构练习 - T003

计算今天是星期几

输入今天的年份,月份和日期,输出今天是周几?

输入 :y m d

输出:k

余数公式:

\[(a_1 + a_2 + \cdots + a_k) \mathrm{mod} N = (a_1 \mathrm{mod} N + a_2 \mathrm{mod} N + \cdots + a_k \mathrm{mod} N) \mathrm{mod} N \]

闰年的判断:(满足以下其中条件即可)

  1. 年份能被4整除,但是不能被100整除(普通闰年)
  2. 年份能被400整除(世纪闰年)

从公元0000年开始算起到去年 y-1,闰年的个数有\(\lfloor \frac{y-1}{4} \rfloor - \lfloor \frac{y-1}{100} \rfloor + \lfloor \frac{y-1}{400} \rfloor\)
平年 365天对 7的余数为 1,闰年 366天对 7的余数为 0,则从0000年到去年的天数对7的余数为\(y' = y-1 + \lfloor \frac{y-1}{4} \rfloor - \lfloor \frac{y-1}{100} \rfloor + \lfloor \frac{y-1}{400} \rfloor\)

再计算出今年1月到前月m-1的天数对7的余数\(m'\)(注意闰年2月份天数+1);

最后计算得到结果: \((y' + m' + d) \mathrm{mod} 7\)


#include <bits/stdc++.h>
using namespace std;

/*
余数公式:
(a1+a2+a3+...+ak) mod N = (a1 mod N + a2 mod N + a3 mod N +...+ ak mod N ) mod N
*/

int main()
{
    int y, m, d;
    int dy, dm, dd;
    int sum; 
    int months[12] = {31, 28, 31, 30, 31, 30, 
                      31, 31, 30, 31, 30, 31};
    scanf("%d%d%d", &y, &m, &d);
    
    // 计算从去年 y-1到 0000年对 7的余数,
    // 平年 365天对 7的余数为 1,
    // 闰年 366天对 7的余数为 0,
    // 闰年是指满足以下其中一个条件的年份:
    // 1. 能被4整除但不能被400整除(普通闰年)
    // 2. 能被400整除(世纪闰年)
    dy = (y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400;
    
    // 计算今年1月到 m-1月的总天数对 7 的余数
    sum = 0;
    for(int i = 1; i <= m - 1; ++i){
        sum = sum + months[i-1];
    }
    dm = sum % 7;
    // 闰年再加1天
    if ( m>=2 && ((y%4==0 && y%100!=0) || (y%400==0))){
        dm = (dm + 1) % 7;
    }

    // 天数差加起来再求余数
    dd = (dy + dm + d) % 7;
    printf("%d\n", dd);

    return 0;
}
posted @ 2021-08-29 19:30  Wreng  阅读(45)  评论(0编辑  收藏  举报