计算星期几 基姆拉尔森公式

238 阅读1分钟

计算星期几-基姆拉尔森公式

week代表周几,0=星期一,6=星期天

week=( day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400)\%7

代码实现如下:

#include <stdio.h>
#include <string.h>

int months[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}};
const char *WeeksMap[8] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
const char *MonthsMap[13] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
};

bool isLeap(int year)
{
  return (year % 4 == 0 && year % 100 != 0) || (year % 100 == 0 && year % 400 == 0);
}

int main(int argc, char const *argv[])
{
  int y1, m1, d1;
  char mString[13];

  while (scanf("%d %s %d", &d1, mString, &y1) != EOF)
  {
    for (int i = 0; i < 12; i++)
    {
      if (strcmp(mString, MonthsMap[i]) == 0)
      {
        m1 = i + 1;
      }
    }
    if (m1 == 1 || m1 == 2)
    {
      m1 += 12;
      y1--;
    }
    int a = (d1 + 2 * m1 + 3 * (m1 + 1) / 5 + y1 + y1 / 4 - y1 / 100 + y1 / 400) % 7;
    printf("%s\n", WeeksMap[a]);
  }

  return 0;
}

参考资料:

[1].《算法笔记》第三章. p91

[2]. 懒羊羊的算法实现.码云