王道机试指南NO.4Day Of Week

时间限制:1s 内存限制:32MB

题目描述

输入一个日期,要求输出该日期为星期几

输入样例

9 October 2001
14 October 2001

输出样例

Tuesday
Sunday

题目分析

1、日期类问题,先预处理每个日期与原点日期(0年1月1日)之间的天数间隔,存入buf三维数组。
2、看到题目考虑两个问题:
①今天星期几?
②今天和给定日期相隔几天
3、int days = buf[y][m][d] - buf[2019][2][21]; //可能为负数
days += 4;
算出来的天数差可能是个负数,今天是星期四,对应数组下标为4,经此计算得到经过days天后的下标

代码

#include <stdio.h>
#include <string.h>
#define ISYEAR(x) x%100 != 0 && x%4 == 0 || x%400 == 0 ? 1 : 0

int dayOfMonth[13][2] = {
    0, 0,
    31, 31,
    28, 29,
    31, 31,
    30, 30,
    31, 31,
    30, 30,
    31, 31,
    31, 31,
    30, 30,
    31, 31,
    30, 30,
    31, 31
};

struct Date{
    int Day;
    int Month;
    int Year;
    void nextDay(){
        Day++;
        if(Day > dayOfMonth[Month][ISYEAR(Year)]){
            Day = 1;
            Month++;
            if(Month > 12){
                Month = 1;
                Year++;
            }
        }
    }
};

int buf[3001][13][32]; //预处理,存储每一天与原点日期的天数差
char monthName[13][20] = {
    "",
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
}; // 月名 每个月对应下标1-12

char weekName[7][20]={
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
}; //周名 每个周对应下标0-6

int main(){
    Date tmp;
    int cnt = 0;
    tmp.Day = 1;
    tmp.Month = 1;
    tmp.Year = 0;
    while(tmp.Year != 3001){
        buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
        tmp.nextDay();
        cnt++;
    }// 预处理出每一天与原点日期的天数差

    int d, m, y;
    char s[20];
    while(scanf("%d%s%d", &d, s, &y) != EOF){
        for(m = 1; m <= 12; m++){
            if(strcmp(s, monthName[m]) == 0){
                break; //将输入的字符与月名比较,得出月数
            }
        }
        int days = buf[y][m][d] - buf[2019][2][21]; //可能为负数
        days += 4; // 2019/2/21今天为星期四,对应下标为4,得到目标日期的下标
        puts(weekName[(days%7+7)%7]);
    }
    return 0;
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值