题目描述
Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me what day it is ?
Input
There are multiply cases.
One line is one case.
There are three integers, year(0<year<10000), month(0<=month<13), day(0<=day<32).
Output
Output one line.
if the date is illegal, you should output "illegal". Or, you should output what day it is.
Sample Input
2007 11 17
Sample Output
Saturday
solve 1:
公式:W = month+365*(year-1)+r+day
W是公元1年1月1日到所给日期所积天数
365*(year-1)+r是公元1年1月1日到所给年1月1日所积天数
month是所给年1月1日到所给日期所积天数
day是所给月1日到所给日期所积天数
代码
#include<stdio.h>
int run(int year)
{
return (year%4==0&&year%100!=0||year%400==0);
}
int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int year,month,day;
while(~scanf("%d%d%d",&year,&month,&day))
{
if(run(year))
{
b[2]=29;
}
else
{
b[2]=28;
}
if(day>b[month]||year<1||year>10000||day<1||month<1||month>12)
{
printf("illegal\n");
continue;
}
int W=0,r=0;
for(int i=1;i<year;i++)
{
if(run(i))
{
r++;//标记有几个闰年
}
}
for(int j=1;j<month;j++)
{
W=W+b[j];
}
W = W+365*(year-1)+r+day; //r为多的天数,有几个闰年多几天
int p=W%7;//最终的W代表从公元1年到题给的日期所积的天数,取余7得星期数
switch(p)
{
case 0:
printf("Sunday\n");
break;
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
}
}
return 0;
}
solve 2:
基姆拉尔森计算公式:
w=day+month*2 + 3*(month + 1) / 5 + year + year/4 - year/100 + year/400 + 1 ;
代码:
#include<stdio.h>
int run(int n)
{
return (n%4==0&&n%100!=0)||(n%400==0);
}
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int d,m,y,w;
while(~scanf("%d%d%d",&y,&m,&d))
{
if(run(y))
{
a[2]=29;
}
else
{
a[2]=28;
}
if(d<1||d>a[m]||m<1||m>12||y<1||y>10000)
{
printf("illegal\n");
}
else
{
if(m==1|m==2)
{
m=m+12;
y--;
}
w=(d+m*2+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
switch(w)
{
case 0:
printf("Sunday\n");
break;
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
}
}
}
return 0;
}