题解 | Day of Week

Day of Week

https://www.nowcoder.com/practice/a3417270d1c0421587a60b93cdacbca0

//习题2.7
#include<map>
#include<cstdio>
#include<string>
using namespace std;
int main(){
    //概要:今天是2026年3月12日星期四,以这个为基准,算出通过输入的日期是星期几
    int year,mon,day;   //year是年,day是日,mon表示是第几个月
    char str[100];  //c风格字符串用来做输入和输出
    string month;
    int mDay[31]={0,31,28,31,30,31,30,31,31,30,31,30,31};   //mDay[1]表示1月有多少天
    string intToWeekDay[7]={"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday", "Saturday"};

    //map从string映射到int
    map<string,int> monthToint{ //将月份对应为整数
            {"January",1},
            {"February",2},
            {"March",3},
            {"April",4},
            {"May",5},
            {"June",6},
            {"July",7},
            {"August",8},
            {"September",9},
            {"October",10},
            {"November",11},
            {"December",12}
    };

    bool isBefore;  //isBefore为真则在今天之前,为假则在今天之后
    while(scanf("%d %s %d",&day,str,&year)!=EOF){   //scanf用c风格输入
        //1.得到输入字符串月份的对应值,即是一年的第几个月
        month=str;  //将字符串从c风格转换为c++风格
        mon=monthToint[month];  //名称[键]-->得到值,如 monthToint[January]可以得到1

        //2.判断在今天之前还是之后
        if(year<2026
        || 2026==year && mon<3
        || 2026==year && 3==mon && day<12){ //今天是2026年3月12日
            isBefore=true;  //为真则在今天之前
        }else{
            isBefore=false; //为假则在今天之后
        }

        //3.根据输入的年月日是在今天之前还是之后,初始化起点和终点
        int begYear,begMon,begDay,endYear,endMon,endDay;
        if(isBefore==true){ //为真则输入的日期在今天之前
            begYear=year;
            begMon=mon;
            begDay=day;
            endYear=2026;
            endMon=3;
            endDay=12;
        }else{  //为假则输入的日期在今天之后
            begYear=2026;
            begMon=3;
            begDay=12;
            endYear=year;
            endMon=mon;
            endDay=day;
        }

        //4.从begin走到end
        int totalDay=0; //用于记录到最终end走了多少天
        while(true){
            if(begYear==endYear && begMon==endMon && begDay==endDay){   //当beg走到了end则退出
                break;
            }
            totalDay++; //每循环一次,总天数往后加一

            //nextDay操作(日期问题常规模板)
            if(begYear%400==0 || begYear%100!=0 &&begYear%4==0){    //判断这一年是否为闰年,是闰年则2月有29天
                mDay[2]=29;
            }else{
                mDay[2]=28;
            }
            begDay++;   //天数加一
            if(begDay>mDay[begMon]){  //当天数超过了该月的天数,则去往下一个月1日
                begMon++;   //月加一
                begDay=1;   //天数重置为1
                if(begMon>12){    //当月数加一之后,超过了12,说明一年走完了,要进入下一年1月
                    begYear++;  //年加一
                    begMon=1;   //月重置为1
                }
            }
        }

        //5.通过totalDay,计算是周几
        if(isBefore==true){ //输入的日期在今天之前
            //(x+totalDay)%7=4 --> x=(11-totalDay%7)%7
            int weekday=(11-totalDay%7)%7;
            printf("%s\n",intToWeekDay[weekday].c_str());
        }else{  //输入的日期在今天之后
            //得到了整数,现在需要输出的是字符串
            int weekday=(totalDay+4)%7;  //得到的是0~6之间的数,0对应周日,1对应周一...
            //weekday是int型,通过与数组intToWeekDay下标对应转为string类型是c++风格的;输出用的c风格,再转为c风格即可.c_str()
            printf("%s\n",intToWeekDay[weekday].c_str());
        }
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务