算法小站
首页
wiki
新鲜事
文章搜索
网站导航
回忆录
首页
wiki
新鲜事
文章搜索
网站导航
回忆录
登录
注册
算法基础
搜索
数据结构
字符串
数学
图论
动态规划
计算几何
杂项
wiki 主题
算法基础
二维偏序
高维前缀和
树上差分
搜索
数据结构
线段树
线段树单点修改
线段树区间修改
动态开点线段树
线段树的合并(一)
可持久化线段树
树链剖分
平衡树
FHQ-Treap
珂朵莉树
分块
位分块
根号分治
字符串
数学
组合计数
二项式定理
图论
图的连通性
有向图的强连通分量
无向图的割点割边和双连通分量
流和匹配
最大流
最大流的一些应用
图论杂项
最大团搜索算法
树上问题
kruskal重构树
kruskal重构树的一些问题
动态规划
计算几何
杂项
启发式合并
高精度
一些经典问题
约瑟夫环
曼哈顿距离
多重集合的排列组合
蔡勒公式
排列与置换
主题名称
是否为父主题
是否为其添加wiki文章
取 消
确 定
选择主题
修改主题名称
修改父主题
修改wiki文章
取 消
删 除
修 改
算法基础
搜索
数据结构
字符串
数学
图论
动态规划
计算几何
杂项
杂项
启发式合并
高精度
一些经典问题
约瑟夫环
曼哈顿距离
多重集合的排列组合
蔡勒公式
排列与置换
[[ item.c ]]
0
0
蔡勒公式
## 蔡勒公式 用于计算某个公历日期是星期几 ```math \displaystyle h = \left( q + \lfloor \dfrac{13(m+1)}{5} \rfloor + K + \lfloor \dfrac{K}{4} \rfloor + \lfloor \dfrac{J}{4} \rfloor + 5J \right) \bmod 7 ``` 其中 * $$h$$是星期代码,$$0=$$星期六,$$1=$$星期日,$$2=$$星期一 * $$q \in [1, 31] =$$日期 * $$m =$$月份,$$3 = 3$$月,$$4 = 4$$月,$$\cdots$$,$$14 = 2$$月 * $$K =$$年份的后两位数,$$year \bmod 100$$ * $$J = $$年份的前两位数,$$year / 100$$ **特别地,**1 月和 2 月要看作**上一年**的`13`月和`14`月 ### 例子 例一,`2025-08-14` $$q = 14, m = 8, K = 25, J = 20$$,带入蔡勒公式,$$h = 5$$,星期四 例二,`2000-01-01` 注意,`1`月需要调整,等价于`1999-13-01` $$q = 1, m = 13, K = 99, J = 19$$,带入蔡勒公式,$$h = 0$$,星期六 ## 基姆拉尔森计算公式 将日期`y-m-d`转换成一个**连续的日序号**,把`0001-01-01`映射成`0` 函数返回的是从公元`0001-01-01`起已经过去的天数,**基于格里高利历的延拓** 因为`2`月有闰年,不好计算,把`2`月当成上一年的`14`月,这样我们只需要关注 这一年之前有几个闰年,以及**当年**这个月之前**(不包括这个月)**过去了几天 这样算天数的时候,都是`31, 30`交替的,便于计算 ```math \displaystyle zeller(y, m, d) = 365y + \lfloor \dfrac{y}{4} \rfloor - \lfloor \dfrac{y}{100} \rfloor + \lfloor \dfrac{y}{400} \rfloor + \lfloor \dfrac{153(m-3) + 2}{5} \rfloor + d - 307 ``` > 首先,计算这一年之前(不包括这一年),有多少个闰年?其中,`2`月看作上一年的`14`月 `1`月看作上一年的`13`月 闰年的数量是$$\lfloor \dfrac{y}{4} \rfloor - \lfloor \dfrac{y}{100} \rfloor + \lfloor \dfrac{y}{400} \rfloor $$ 为什么呢?格里高利闰年规则是 ```bash 被 4 整除的是闰年 被 100 整除的不是闰年 除非能被 400 整除,仍然是闰年 ``` 这样,这一年之前的时间,就是$$365y + \lfloor \dfrac{y}{4} \rfloor - \lfloor \dfrac{y}{100} \rfloor + \lfloor \dfrac{y}{400} \rfloor$$ > 接着考虑这个月之前的总天数(不包括这个月) ```math \displaystyle \text{前 t 个月的总天数} = 30t + (前 t 个月中 31 天的个数) ``` ```bash 31 30 31 30 31 31 30 31 30 31 31 28(或29) ``` 不难发现,每 5 个月里,恰有 3 个月是 31 天,近似地,应该有$$\lfloor \dfrac{3t}{5} \rfloor$$个 31 天 然后加上一个修正项`2`,前$$t$$个月,即第$$[0\cdots t-1]$$个月,`31`天的总个数是 ```math \lfloor \dfrac{3t +2}{5} \rfloor ``` 合并上面的结果 ```math \displaystyle \text{前 t 个月的总天数} = 30t + \lfloor \dfrac{3t+2}{5} \rfloor = \lfloor \dfrac{153t + 2}{5} \rfloor = \lfloor \dfrac{153(m - 3) + 2}{5} \rfloor ``` > 接着考虑日期的修正,$$+d$$很好理解 但是把`0001-01-01`作为基准值,带入公式,`(y, m, d) = 1, 1, 1` 因为$$m < 3$$,实际上`(y, m, d) = (0, 13, 1)`,代入之后 年份 = 0, 月份 = $$(153(13-3) + 2) / 5 = 306$$,`d = 1`,所以标准值是`307` 要减去`epoch = 307`
看完文章有啥想法
发布评论
目录
[[ item.c ]]
51 人参与,0 条评论