蔡勒公式(这里借用网上一张图)
例如:2019年10月18
c: 代表20
y: 代表19
m: 代表10
d: 代表18
[ ]: 代表取整
1、2月要当成上一年的13、14月来计算
示例:计算星期几
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> void get_input(double *c, double *y, double *m, double *d); int calc_week(double c, double y, double m, double d); const char* to_week_str(int week); int main(int argc, char* argv[]) { double c, y, m, d; get_input(&c, &y, &m, &d); int week = calc_week(c, y, m, d); printf("%d%d/%d/%d 是 %s \n", (int)c, (int)y, (int)m, (int)d, to_week_str(week)); system("pause"); return 0; } void get_input(double *c, double *y, double *m, double *d) { int year; int month; int day; char ch; if (scanf("%d", &year) != 1) { puts("read year error"); while ((ch = getchar()) != '\n'); //处理多余的输入字符 return; } ch = getchar(); //跳过'/'符号 if (scanf("%d", &month) != 1) { puts("read month error"); while ((ch = getchar()) != '\n'); //处理多余的输入字符 return; } ch = getchar(); //跳过'/'符号 if (scanf("%d", &day) != 1) { puts("read day error"); while ((ch = getchar()) != '\n'); //处理多余的输入字符 return; } while ((ch = getchar()) != '\n'); //处理多余的输入字符 *c = year / 100; *y = year % 100; *m = month; *d = day; } /* c: 表示年份的前两位数字 y: 表示年份的后两位数字 m: 表示月份,对于1、2月需看作前一年的13、14月 d: 表示日 */ int calc_week(double c, double y, double m, double d) { if (1 == m) { //看作上一年的13月 m = 13; y--; } if (2 == m) { //看作上一年的14月 m = 14; y--; } //蔡勒公式 int w = (int)(y + (int)(y / 4) + (int)(c / 4) - 2 * c + (int)(13 * (m + 1) / 5) + d - 1) % 7; return w; } const char* to_week_str(int week) { const char* weeks[7] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; return weeks[week]; }
运行测试