题解 | 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());
}
}
}

查看12道真题和解析