题意:照着题目中的要求,对于给出的日期算该天是周几。
解法:将输入日期的总天数算出来,然后进行一些处理,我有些处理是试出来的。。。
#include<stdio.h>
#include<string.h>
char week[7][10]= {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char mouth[12][20]= {"January","February","March","April","May","June","July","August","September","October","November","December"};
int a[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int m,d,y,i;
bool isOld(int m,int d,int y) //判断是否在改革前
{
if(y<1752||y==1752&&(m<9||m==9&&d<=2)) return true;
return false;
}
bool isLeap(int y,bool old) //判断是否为闰年
{
if(isOld(m,d,y)) return ((y%4==0)?1:0);
return ((y%4==0&&y%100||y%400==0)?1:0);
}
int day_of_mouth(int m,int d,int y) //在某年的条件下,判断是否为闰年
{
if(m==2) return isLeap(y,isOld(m,d,y))?29:28;
return a[m];
}
int main()
{
int sum;
while(scanf("%d%d%d",&m,&d,&y)&&(m+d+y))
{
sum=0;
if(y<1||m<=0||m>12||d<1||d>day_of_mouth(m,d,y)||(y==1752&&m==9&&3<=d&&d<=13)) //判断是否不符合条件
{
printf("%d/%d/%d is an invalid date.\n",m,d,y);
continue;
}
for(i=1; i<y; i++)
sum+=(isLeap(i,isOld(m,d,i))?366:365);
for(i=1; i<m; i++)
sum+=day_of_mouth(i,d,y);
sum+=d; //至此算出总天数
sum%=7; //通过模7算出星期几
if(isOld(m,d,y)) sum=(sum+12)%7; //我的理解是,要对在更改日期之前的日期,要把少算的12天加回来。
else sum=(sum+1)%7; //不加一就少一天,不知道为什么,求解释。
printf("%s %d, %d is a %s\n",mouth[m-1],d,y,week[sum]);
}
return 0;
}