Day of Week 【日期】【模拟】

Day of Week题意

  • 给你一个日期,你算出那天是星期几

    输入

    9 October 2001
    14 October 2001
    

    输出

    Tuesday
    Sunday
    

思路

  • 模拟
  • 我是以2021年12月31号作为起点,向前or向后算日期,因为我一开始很震惊如果上机的时候不记得几号,星期几怎么办,然后就打算直接用当天来算。
  • 然后我意识到,上机有电脑!!!
  • 以2021.12.31作为起点
    • 先算到要求的年份的12月31日星期几
    • 然后算要求的月份的31号周几
    • 然后再算要求的日子
  • 向前和向后主要区别
    • 年份的日子取模的时候,往过去的年份是减去当年的日子,而往未来的年份是加上未来的日子。
  • 注意要判断闰年

代码

#include<bits/stdc++.h>
using namespace std;
int date[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string strm[13]={"","January", "February", "March", "April", "May", "June",
              "July", "August", "September", "October", "November", "December"};
string strw[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int y, m, d;
int yearcnt = 0;
int my = 2021, mm = 12, md = 31, mw = 4;
bool isLeap(int year){
    if((!(year%4)&&(year%100))||!(year%400)){
        date[2]=29;
        yearcnt = 366;
        return true;
    }
    else{
        date[2]=28;
        yearcnt = 365;
        return false;
    }
}
int main(){
    string str;
    while(cin>>d>>str>>y){
        for(int i=1;i<13;i++)
        {
            if(str.size()==strm[i].size() && str==strm[i]){
                m = i;
                break;
            }
        }
        int iy, im, id, iw=mw;
        for(iy = my; iy!=y; ){
            // 注意这里未来和过去的区别!
            if(y>iy){
                // 要加上未来一年的日子,而不是现在这一年
                isLeap(++iy);
                iw = (iw+(yearcnt%7))%7;
            }
            else{
                // 要减去这一年的日子
                isLeap(iy);
                iw = (iw-(yearcnt%7)+7)%7;
                iy--;
            }
        }
        isLeap(iy);
        for(im = mm; im!=m; ){
            if(m>im){
                iw = (iw + date[im]%7)%7;
                im++;
            }
            else{
                iw = (iw - date[im]%7 + 7) % 7;
                im--;
            }
        }
        if(date[im]<d){
            iw = (iw + (d - date[im])%7)%7;
        }
        else{
            iw = (iw - (date[im] - d)%7 + 7)%7;
        }
        cout<<strw[iw]<<endl;
    }
    return 0;
}
上一篇:C语言拾锦 --- 对指定的结构体数组成员进行初始化


下一篇:wpf 自动创建桌面快捷方式