蔡勒公式计算星期几

作者:追风剑情 发布于:2019-10-18 18:04 分类:Algorithms

蔡勒公式(这里借用网上一张图)

1111.png

例如: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];
}


运行测试

222.png

3333.png


4444.png

55555.png


666.png

77777.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号