HDU 1308 What Day Is It?(模拟题)

解题报告:输入一个年月日,让你求出那一天是星期几,但是做这题之前必须先了解一点历史。首先在1582年之前,判断是否是闰年的标准是只要能被四整除就是闰年,

然后在1752年9月2号的后的11天被抹去了,也就是说1752年9月2号的第二天不是9月3号,而是9月14号。然后知道这些这题就好做了,我的做法是把1年1月1号作为

参考日,那天是星期天,然后计算输入的日子与那天差多少天就可以判断出输入的日子是星期几了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int m[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31},
};
char xingqi[8][20] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char yue[13][20] = {"","January","February","March","April","May","June","July","August","September","October","November","December"};

int judge(int year)   //判断是否为润年
{
    if(year > 1582)
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    else return year % 4 == 0;
}

int num_day(int mon,int day,int year)      //以公元1年1月1日为参考点,求到输入的日期为止已经过去的天数
{
    int tot = 0;
    for(int i = 1;i < year;++i)
    tot += (judge(i)? 366:365);
    for(int i = 1;i < mon;++i)
    tot += m[judge(year)][i];
    tot += day;
    return tot;
}
int panduan(int mon,int day,int year)   //判断输入的日期是否合法
{
    if(mon <= 0 || day <= 0 || year <= 0)
    return 0;
    if(mon > 12)
    return 0;
    if(day > m[judge(year)][mon])
    return 0;
    return 1;
}

int main()
{
    int day,mon,year;
    while(scanf("%d%d%d",&mon,&day,&year))
    {
        if(day == mon && mon == year && year == 0)
        break;
        int tot_d = num_day(mon,day,year);
        if(tot_d > 639798)
        tot_d -= 11;
        tot_d -= 1;
        if(panduan(mon,day,year))
        printf("%s %d, %d is a %s\n",yue[mon],day,year,xingqi[tot_d % 7]);
        else printf("%d/%d/%d is an invalid date.\n",mon,day,year);
    }
    return 0;
}
View Code

 

posted @ 2014-02-26 19:17  xiaxiaosheng  阅读(545)  评论(0编辑  收藏  举报