What day is it
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7699 Accepted Submission(s): 2189
Problem Description
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
Author
LGX
Source
HDU 2007-11 Programming Contest_WarmUp
Recommend
威士忌 | We have carefully selected several similar problems for you: 2136 2135 2137 2134 21
注意不合法的情况,m,d,y必须都大于1,
基姆拉尔森计算公式:
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7
把一月和二月看成是上一年的十三月和十四月,例:如果是1990-1-1则换算成:1989-13-1来代入公式计算。
我还把周六的英文多加了个s
#include<iostream>
using namespace std;
bool leap(int y)
{
if(y%4==0&&y%100!=0||y%400==0)
return true;
else
return false;
}
int main()
{
char a[7][15]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int y,m,d,i,j,b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
while(~scanf("%d%d%d",&y,&m,&d))
{
if(leap(y))
b[2]=29;
if(y>10000||y<1||m<1||m>12||d>b[m]||d<1)
{
printf("illegal\n");
continue;
}
if(m<3)
{
y--;
m+=12;
}
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 核心在这,基姆拉尔森公式(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7
printf("%s\n",a[w]);
b[2]=28;
}
return 0;
}