这题非常恶心。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
#include <iterator>
using namespace std;
typedef unsigned long long ULL;
const char* xingqi[]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* month[]={"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int mdays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int olddate(int m,int d,int y)
{
if(y<1752)
return 1;
else if(y==1752&&m<9)
return 1;
else if(y==1752&&m==9&&d<=2)
return 1;
else return 0;
}
int leapyear(int y)
{
if(y<=1752)
return y%4==0?1:0;
else
return ((y%4==0&&y%100!=0)||y%400==0)?1:0;
}
int check(int m,int d,int y)
{
if(m<=0||d<=0||y<=0||m>12||d>mdays[m])
return 0;
if(y==1752&&m==9&&d>2&&d<14)
return 0;
return 1;
}
int main()
{
int m,d,y,day;
while(scanf("%d%d%d",&m,&d,&y)!=EOF&&(m||d||y))
{
mdays[2]=28+leapyear(y);
if(check(m,d,y))
{
day=d;
for(int i=1;i<m;i++)
day+=mdays[i];
for(int i=1;i<y;i++)
day+=365+leapyear(i);
printf("%s %d, %d is a %s\n", month[m], d, y, xingqi[(day+ (olddate(m,d,y) ? 5 : 1)) % 7]);
}
else
printf("%d/%d/%d is an invalid date.\n", m, d, y);
}
return 0;
}
/*
公元1.1.1是星期六,虽然不知道为啥。从数据中可以看出来那段特殊时期星期是怎么判断的
*/