http://ac.jobdu.com/problem.php?pid=1043
有两种做法:
一公式法:如code1。编码简单,但是在九度上不能ac。
二比较法:如code2,比较今天和目标时间的差,推算目标时间的星期。
code1:
#include <stdio.h>
#include <cstring>
static const char* month [] {
"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
};
static const char* day[] = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
int whatday(int d,int m,int y){
int ans;
if(m==1 || m == 2) m+=12,y--;
if((y<1752) || (y==1752&&m<9) || (y==1752&&m==9&&d<3))
ans = (d + 2*m + 3*(m+1)/5 + y + y/4 +5 )%7;
else
ans = (d + 2*m + 3*(m+1)/5 + y + y/4 -y/100 +y/400)%7;
return ans;
}
int main(){
//freopen("in/1043.in","r",stdin);
int y,m,d;
char month_[20];
while(scanf("%d %s %d",&d,month_,&y)!=EOF ){
m= 1;
for (int i = 1; i <=12 ; ++i) {
if(strcmp(month[i],month_)==0){
m = i;break;
}
}
printf("%s\n",day[whatday(d,m,y)]);
}
}
#include <stdio.h>
#include <cstring>
static const char* days[] = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
static const char* month [] {
"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
};
const int monthd[] ={
0,31,28,31,30,31,30,31,31,30,31,30,31
};
int leap(int y){
return (y-1)/4 - (y-1)/100 + (y-1)/400;
}
bool isLeap(int y){
if(y%400==0||(y%100&&y%4==0)) return true;
return false;
}
int calcu(int y,int m,int d){
int res = (y-1) * 365 + leap(y);
for (int i = 1; i < m; ++i) {
res += monthd[i];
}
if(isLeap(y) && m >2 ) res++;
res += d;
return res;
}
int main(){
//freopen("in/1043.in","r",stdin);
int y,m,d;
char month_[20];
while(scanf("%d %s %d",&d,month_,&y) !=EOF){
m=1;
for (int i = 1; i <=12; ++i) {
if(strcmp(month[i],month_) == 0 ) {
m = i;
break;
}
}
int delta = calcu(y,m,d) - calcu(2017,2,6) ;
int day;
day= (0 + delta%7 + 7)%7; //2017,2,6 is Monday
printf("%s\n",days[day]);
}
}