题解 | #Day of Week#

Day of Week

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

//这道题是有公式的,但是建议别用公式,公式有点不太好记
//采用nextDay思想,这个思想比较通用
#include "stdio.h"
#include "map"
#include "string"
using namespace std;
map<int,string> weekMap = {{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},
                           {5,"Friday"},{6,"Saturday"},{7,"Sunday"}};
map<string,int> monthMap = {{"January",1},{"February",2}, {"March",3}, {"April",4},
                            {"May",5}, {"June",6},{"July",7}, {"August",8},
                            {"September",9}, {"October",10}, {"November",11}, {"December",12} };
int monthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool leapJudge(int year){
    if(year%4 == 0 && year%100 != 0 || year%400 == 0)
        return true;//true为闰年
    else
        return false;
}

bool bigOrSmall(int day1,int month1,int year1,int day2,int month2,int year2){
    if(year1 > year2)
        return true;//true为1在2日期后
    else if(year1 == year2 && month1 > month2)
        return true;
    else if (year1 == year2 && month1 == month2 && day1 > day2)
        return true;
    else
        return false;//1在2日期前
}

void weekJudge1(int dayAim,int monthAim,int yearAim){
    int day = 9,month = 10,year = 2001;
    int week = 2;bool flag = false;//false表明不是闰年
    while (true){
        if (day == dayAim && month == monthAim && year == yearAim){
            printf("%s\n",weekMap[week].c_str());
            return;
        }
        if (leapJudge(year))
            flag = true;
        else
            flag = false;
        ++week;
        if (week == 8)
            week = 1;
        ++day;
        if(day > monthDay[month] && month != 2){
            day = 1;
            ++month;
        }else if(day > monthDay[month] && month == 2 && flag == false){
            day = 1;
            ++month;
        }else if(day > monthDay[month] && month == 2 && flag == true){
            if (day == 30){
                day = 1;
                ++month;
            }
        }
        if(month > 12){
            month = 1;
            ++year;
        }
    }
}

void weekJudge2(int dayAim,int monthAim,int yearAim){
    int day = 9,month = 10,year = 2001;
    int week = 2;bool flag = false;//false表明不是闰年
    while (true){
        if (day == dayAim && month == monthAim && year == yearAim){
            printf("%s\n",weekMap[week].c_str());
            return;
        }
        if (leapJudge(year))
            flag = true;
        else
            flag = false;
        --week;
        if (week == 0)
            week = 7;
        --day;
        if(day = 0 && month != 3){
            day = monthDay[month-1];
            --month;
        }else if(day = 0 && month == 3 && flag == false){
            day = monthDay[2];
            --month;
        }else if(day = 0 && month == 3 && flag == true){
            day = 29;
            month = 2;
        }
        if(month = 0){
            month = 12;
            --year;
        }
    }
}

int main(){
    int day,year,month;
    char buf[12];
    while (scanf("%d %s %d",&day,buf,&year)!=EOF){
        string str = buf;
        month = monthMap[str];
        if (day == 9 && month == 10 && year == 2001){
            printf("Tuesday\n");
            continue;
        } else{
            if(day,month,year,9,10,2001)
                weekJudge1(day,month,year);
            else
                weekJudge2(day,month,year);
        }
    }
}

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-30 21:35
爱蜜莉雅碳劝退测开:裁员裁大动脉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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