数日子(SDUT 2558)

来源:互联网 发布:云豹直播源码搭建教程 编辑:程序博客网 时间:2024/06/09 15:11

数日子

        Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
  按照公元纪年法,闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年份除外,例如 1900 年就不是闰年。现在我们已知 2000 年 1 月 1 日为 星期六,你的任务是,对于给定的一个整数 n,写个程序计算并输出从 2000 年 1 月 1 日经过 n 天后的日期和该天是星期几。

Input
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (0 <= n <= 99999)。

Output
对于每组测试数据,输出只有一行,为 n 天后的日期和该天为星期几,输出格式为 “YYYY-MM-DD week-day”(不包含引号) 具体格式见样例输出。

Example Input
100
400

Example Output
2000-04-10 Monday
2001-02-04 Sunday

Hint
“Monday”“Tuesday”“Wednesday”“Thursday”“Friday”“Saturday”“Sunday”
题目连接:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2558.html

题意很简单,就是要计算出从2000年1月1日 星期六 经过n天后的日期
一开始我一看n最大才99999就直接暴力了,结果超时了,想了一下觉得应该是因为有多组输入,而计算时间不是求一次的,而是多组数据所用的时间和,所以我就用数组存起来了每经过一天的日期
至于星期的计算方法,将天数对7取余就好

AC的代码

/*本代码的主要想法是循环所有的日期,如果日期合法则计数加一,直到要求的天数*/#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <string>#include <cstring>#include <algorithm>#include <vector>#include <stack>#include <queue>using namespace std;#define N 100000int yea[N];int mon[N];int da[N];int main(void){    int i,j,k;    int year = 2000,month = 1,day = 1;    i = 0;    int n;    for(year = 2000;; year++){        for(month = 1; month <= 12; month++){            for(day = 1; day <= 31; day++){                if(!((year%4==0 && year%100 != 0) || year%400 == 0)){                    if(month == 2 && day == 29)                        continue;                }                if(month == 2){                    if(day == 30 || day == 31)                        continue;                }                if(day == 31){                    if(month == 2 || month == 4 || month == 6 || month == 9 || month == 11)                        continue;                }                yea[i] = year;                mon[i] = month;                da[i] = day;                i++;                if(i > 99999)                    break;            }            if(i > 99999)                break;        }        if(i > 99999)            break;    }    while(scanf("%d",&n) != EOF){        year = yea[n];        month = mon[n];        day = da[n];        if(month / 10 == 0 && day / 10 != 0)            printf("%d-0%d-%d ", year, month, day);        else if(day / 10 == 0 && month / 10 != 0)            printf("%d-%d-0%d ", year, month, day);        else if(month / 10 == 0 && day / 10 == 0)            printf("%d-0%d-0%d ", year, month, day);        else            printf("%d-%d-%d ", year, month, day);        switch(n%7){            case 0: printf("Saturday\n");break;            case 1: printf("Sunday\n");break;            case 2: printf("Monday\n");break;            case 3: printf("Tuesday\n");break;            case 4: printf("Wednesday\n");break;            case 5: printf("Thursday\n");break;            case 6: printf("Friday\n");break;        }    }    return 0;}

另一种方法是按月计算,以月为单位处理数据