数日子(SDUT 2558)

数日子

        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 100000
int 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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值