逻辑很简单就是,输入下面这种格式的日期字符串,输出星期几
样例输入
21 December 2012
5 January 2013
样例输出
Friday
Saturday
两种方法:
- 与其他的日期比较
- 用伟大的数学家推导的公式
第一种方法就不说了,这里说公式
这是两个公式的百科 蔡勒公式、 基姆拉尔森计算公式
这个博文说的很清楚 [https://www.cnblogs.com/tgycoder/p/4960487.html](https://www.cnblogs.com/tgycoder/p/4960487.html)
因为蔡勒公式只适用于1582年(中国明朝万历十年)10月15日之后的情形,所以我们用基姆拉尔森计算公式
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char monthStr[12][10] = {
"January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"
};
char weekStr[7][10] = {
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
};
int day, year;
char month[10];
int i;
int w, y, m, d;
while (scanf("%d%s%d", &day, month, &year) != EOF)
{
y = year;
for (i = 0; i < 12; i++)
{
if (strcmp(monthStr[i], month) == 0)
{
// 1月按上一年的13月来算
if (i == 0)
{
m = 13;
y--;
}
// 2月按上一年的14月来算
else if (i == 1)
{
m = 14;
y--;
}
else
{
m = i + 1;
}
break;
}
}
d = day;
// 公式计算
w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y /100 + y / 400) % 7;
printf("%s\n", weekStr[w]);
}
return 0;
}