知识点:
方法一:细节优化,小技巧起大作用。
方法二:Zeller公式法。
//方法一:暴力法
#include <cstdio> //公元一年一月一号是星期一
inline bool leap_year(int year)
{
if((year%4==0&&year%100)||year%400==0) return 1;
else return 0;
}
int main()
{
int y,m,d;
while(scanf("%d%d%d",&y,&m,&d)!=EOF)
{
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(leap_year(y)) month[2]=29;
if(y<=0||m<=0||m>12||d<=0||d>month[m])
{
puts("illegal");
continue;
}
int cnt=0;
for(int i=4;i<y;i+=4) //求y之前有多少个闰年
if(leap_year(i)) cnt++;
int sum=365*(y-1)+cnt; //小技巧起大作用
for(int i=1;i<m;i++)
sum+=month[i];
sum=(sum+d)%7;
char *day[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
puts(day[sum]);
}
return 0;
}
//方法二:Zeller公式法
/*
Zeller(蔡勒)公式:
是一个计算星期几的公式。随便给定一个日期,就能用这个公式推算出是星期几。
蔡勒公式如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下:
w~星期:w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,
5-星期五,6-星期六
c~世纪:年份的前两位数
y~年:年份的后两位数
m~月:3<=m<=14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,
比如2003年1月1日要看作2002年的13月1日来计算
d:日
[ ]代表取整,即只要整数部分。
*/
#include <cstdio>
inline bool leap_year(int year)
{
if((year%4==0&&year%100)||year%400==0) return 1;
else return 0;
}
int main()
{
int y,m,d;
while(scanf("%d%d%d",&y,&m,&d)!=EOF)
{
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(leap_year(y)) month[2]=29;
if(y<=0||m<=0||m>12||d<=0||d>month[m])
{
puts("illegal");
continue;
}
if(m==1||m==2)
{
m+=12;
y--;
}
int c=y/100;
y%=100;
int sum=y+y/4+c/4-2*c+26*(m+1)/10+d-1;
while(sum<0)
sum+=7;
sum%=7;
char *day[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
puts(day[sum]);
}
return 0;
}
![](http://hi.csdn.net/attachment/201111/10/0_13208996869442.gif)
![](http://hi.csdn.net/attachment/201111/10/0_13208996954bjq.gif)