4、C++基础:日期类问题(2)

给定一个日期,求出该日为星期几(已知2002-3-28为星期四)

#include <iostream>
using namespace std;

#define ISYEAP(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][ISYEAP(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"
}; // 月名

char weekName[7][20] = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
}; // 周名

int main(void){
  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++;
    }

    cout << "输入年 月 日" << endl;
    cin >> tmp.Year >> tmp.Month >> tmp.Day;

    int days = buf[tmp.Year][tmp.Month][tmp.Day] - buf[2002][3][28]; // 已知2002-3-28为星期四

    cout << weekName[((days+4)%7+7)%7] << endl;

    return 0;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,645评论 0 5
  • 日常总结 2017年3月29日 ORID:焦点讨论法 O-Objective:客观事实层次 关于今天的工作, 你记...
    Mr_Leekon阅读 115评论 0 0
  • 我就知道没有,不要bb。都一年了,老鵰没有秃,李老板没有秃,卫龙小三的毛可浓密了。。张奶奶,一如既往的是个蛇精病迷...
    沧笙踏歌s阅读 125评论 0 2
  • 当你们国庆奔跑在路上体验全国大拥堵时,我正在村里跟我家的狗狗无言相对。 刚回来时被这只毛绒绒的大黑狗吓了一跳,我直...
    妖精的瓶子阅读 530评论 0 0
  • 7月17日 关键词 构建幸福进化俱乐部高品质门槛 助力会员个人成长的核心、首位、基础习惯 推迟满足感 知晓、理解、...
    易查理阅读 261评论 1 1