公式是:
h = (q + 26(m+1)/10 + k + k/4 + j/4 + 5 j)%7
其中:
h是一个星期中的某一天(0为星期六, 1为星期天, 2为星期一, 3为星期二, 4为星期三, 5为星期四, 6为星期五)。
q是某月的第几天。
m是月份, 特别地, 一月和二月分别记为上一年的13月和14月。
j是世纪数(即 year/100)。
k是该世纪的第几年(即year%100)。
注意, 公式中的除法执行的一个整数相除。
下面给出例题以及代码
What day is it
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7462 Accepted Submission(s): 2130
One line is one case.
There are three integers, year(0<year<10000), month(0<=month<13), day(0<=day<32).
if the date is illegal, you should output "illegal". Or, you should output what day it is.
代码:
#include<iostream>
#include<cmath>
#include<sstream>
#include<cstdio>
#include<string>
using namespace std;
int runnian(int x)
{
if((x%4==0&&x%100!=0)||x%400==0)
return true;
else
return false;
}
int tianshu(int y, int m)
{
if(m == 2)
{
if(runnian(y))
return 29;
else
return 28;
}
else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
return 31;
else
return 30;
}
int zele(int year, int month, int day)
{
int h, m;
int q = day;
if(month >= 3)
m = month;
else
{
m = month + 12;
year--;
}
int j = year/100;
int k = year%100;
h = (q + 26*(m+1)/10 + k + k/4 + j/4 + 5*j)%7;
return h;
}
string Eng[] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
int main()
{
int y, m, d;
while(cin>>y>>m>>d)
{
if(y < 0||m<=0||d<=0||m>12||tianshu(y, m)<d)
{
cout<<"illegal"<<endl;
continue;
}
cout<<Eng[zele(y, m, d)]<<endl;
}
return 0;
}