蔡勒公式(这里借用网上一张图)
例如: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];
}
运行测试