UVa 602 简单模拟

来源:互联网 发布:js混淆解密 编辑:程序博客网 时间:2024/04/30 21:42

题意:照着题目中的要求,对于给出的日期算该天是周几。

解法:将输入日期的总天数算出来,然后进行一些处理,我有些处理是试出来的。。。

#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;}