查万年历,2001年1月1日是星期1,然后计算偏移即可
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
bool IsLeapYear(int year){
return year%100!=0&&year%4==0||year%400==0;
}
int DaysInMonth(int year,int month){
switch(month){
case 1: return 31;
case 2: return IsLeapYear(year)?29:28;
case 3: return 31;
case 4: return 30;
case 5: return 31;
case 6: return 30;
case 7: return 31;
case 8: return 31;
case 9: return 30;
case 10: return 31;
case 11: return 30;
case 12: return 31;
default:
return 0;
}
}
int getDeltaInYears(int from,int to){
int current = from+1;
int acc = 0;
for(;current<to;current++){
acc += IsLeapYear(current)?366:365;
}
return acc;
}
int getDeltaInYear(int year,int monthFrom,int dateFrom,int monthTo,int dateTo){
if(monthFrom==monthTo) return dateTo-dateFrom;
int acc = DaysInMonth(year,monthFrom)-dateFrom+1;
int currentMonth = monthFrom+1;
for(;currentMonth<monthTo;currentMonth++){
acc+= DaysInMonth(year,currentMonth);
}
acc += (dateTo-1);
return acc;
}
char monthNameList[13][10] = {
"None",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
int getMonthByName(char* monthName){//字符串比较用strcmp
int month=1;
for(;month<=12;month++){
if(strcmp(monthName,monthNameList[month])==0) break;
//strcmp是==0时相等,容易记错
}
return month;
}
char dayName[7][10]= {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
void Question2_7(){//习题2.7 上海交大 计算给定日期是周几
int date,month,year;
char* monthName = (char*)malloc(sizeof(char*));
while(scanf("%d %s %d",&date,monthName,&year)!=EOF){//char*的输入输出不用&
month = getMonthByName(monthName);
int acc=0;
if(year==2001){//2001.1.1是周一
acc = getDeltaInYear(2011,1,1,month,date);
} else {
if(year>2001){//工具函数是几道题通用的,那边自动+1了,这里要-1对齐
acc+= getDeltaInYears(2000,year);
acc+= getDeltaInYear(year,1,1,month,date);
} else {
acc+= getDeltaInYear(year,month,date,12,31);
acc+= 1;
acc+= getDeltaInYears(year,2001);
}
}
int mod = acc % 7;
printf("%s\n",dayName[(mod+1)%7]);
}
}
int main(){
Question2_7();
return 0;
}

京公网安备 11010502036488号