ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Day of Week 【日期】【模拟】

2021-04-12 17:05:50  阅读:223  来源: 互联网

标签:Week int 31 iw isLeap im date Day 模拟


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;
}

标签:Week,int,31,iw,isLeap,im,date,Day,模拟
来源: https://www.cnblogs.com/xuwanwei/p/14648849.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有