C语言使用蔡勒公式判断日期的星期

引言

在日常编程中,处理日期和时间是一个常见的任务。而了解一个特定日期是星期几,是许多应用程序中的一个基本需求。本篇博客将深入解析一个用于计算星期的 C 语言函数。

代码概览

这个函数使用了蔡勒公式来实现,蔡勒公式(Zeller's Congruence)是一种通过计算日期的数学公式来确定该日期是星期几的算法。它接受三个参数:年份(y)、月份(m)、日期(d)。

void CaculateWeekDay(int y, int m, int d) {if (m == 1 || m == 2) {m += 12;y--;}int iWeek = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;switch (iWeek) {case 0:printf("星期一\n");break;case 1:printf("星期二\n");break;case 2:printf("星期三\n");break;case 3:printf("星期四\n");break;case 4:printf("星期五\n");break;case 5:printf("星期六\n");break;case 6:printf("星期日\n");break;}
}

代码解析

  1. 月份调整

    if (m == 1 || m == 2) {m += 12;y--;
    }
    

    这一部分处理了月份的调整。在这个函数中,将 1 月和 2 月看作前一年的 13 月和 14 月,因此需要将月份加 12,同时将年份减 1。

  2. 计算星期

    int iWeek = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
    

    这一行是核心的星期计算公式。通过一系列数学运算,将给定日期转换为一个数字,然后取模 7,得到一个 0 到 6 的结果,分别对应星期一到星期日。

  3. 星期输出

    switch (iWeek) {// cases for each day of the week
    }
    

    最后,通过 switch 语句根据计算得到的星期数输出对应的星期几。

使用示例

int main() {CaculateWeekDay(2023, 1, 1);  // 输出:星期日CaculateWeekDay(2023, 12, 25);  // 输出:星期一// 可以根据需要调用该函数并传入不同的日期return 0;
}

蔡勒公式

蔡勒(Zeller)公式是一种用于计算一个给定日期是星期几的数学公式。它由德国数学家克里斯蒂安·蔡勒(Christian Zeller)于1883年提出。该公式基于一种称为Zeller的紧缩公式的变体。这个公式适用于格里高利历的日期,即我们常用的日历系统。

蔡勒公式的一般形式如下:

[ h = (q + \left\lfloor\frac{​{13(m+1)}}{5}\right\rfloor + K + \left\lfloor\frac{K}{4}\right\rfloor + \left\lfloor\frac{J}{4}\right\rfloor - 2 \times J) \mod 7 ]

其中:

  • ( h ) 是星期几的数值,0 表示星期六,1 表示星期天,以此类推。
  • ( q ) 是月份中的日期。
  • ( m ) 是月份,对于蔡勒公式来说,1 月和 2 月要视为前一年的 13 月和 14 月。
  • ( K ) 是年份的最后两位数。
  • ( J ) 是年份的前两位数。

在具体的代码中,上面提供的函数就是使用了蔡勒公式来计算给定日期是星期几。函数接受年份(y)、月份(m)和日期(d)作为参数,然后输出相应的星期几。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/303439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【nw.js】使用nw.js将html页面打包成exe免安装程序

文章目录 一、批处理zip命令(已有可跳过此步骤)二、nw.js包三、使用批处理命令打包成exe可执行文件四、使用EnigmaVB打包成免安装可独立运行的exe文件五、结束 一、批处理zip命令(已有可跳过此步骤) 下载zip,你可以到该…

什么牌子的洗地机清洁效果强?2024深度清洁洗地机推荐

随着数代产品的不断迭代,洗地机在清洁力和功能水平上都经历了显著提升,已经成为众多家庭地面清洁的得力助手。近年的销量甚至也超过了许多传统家用清洁电器,彰显其受欢迎的程度。然而,仍有很多对洗地机不够了解的新手,…

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景: 1.何为永恒之蓝? 永恒之蓝(Eternal Blue)爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日, 不法分子…

基于Springboot的宠物领养系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的宠物领养系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

vue3(六)-基础入门之自定义组件与插槽、ref通信

一、全局组件 html: <div id"app"><mytemplace></mytemplace> </div>javascript: <script>const { createApp } Vueconst app createApp({})app.component(mytemplace, {template: <div><button>返回</button>…

【漏洞复现】OpenSSH ProxyCommand命令注入漏洞(CVE-2023-51385)

文章目录 前言一、漏洞背景二、漏洞详情三、影响范围四、漏洞验证 前言 OpenSSH存在命令注入漏洞&#xff08;CVE-2023-51385&#xff09;&#xff0c;攻击者可利用该漏洞注入恶意Shell字符导致命令注入。 一、漏洞背景 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09…

[python]python使用M-LSD直线检测算法onnx部署模型实时检测

介绍 github地址&#xff1a;https://github.com/navervision/mlsd LSD (M-LSD)一种用于资源受限环境的实时轻量线段检测器。它利用了极其高效的 LSD 架构和新颖的训练方案&#xff0c;包括 SoL 增强和几何学习方案。模型可以在GPU、CPU甚至移动设备上实时运行。算法已开源&a…

数据库之MySQL的介绍

操作系统&#xff1a; windows&#xff1a;win10、win11、win7、windows Server2016 Linux/Unix &#xff1a;红帽&#xff08;RedHat&#xff09;、Bebian、SUSE MacOS Linux系统&#xff1a;CantOS&#xff08;yum、dnf&#xff09;、Ubuntu&#xff08;apt、apt—get&am…

如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。 考虑一个简化的餐厅订单处理系统&#xff0c;其中包括服务员&#xff08;Waiter&#xff09;、厨师&#xff08;Chef&#xff09;和收银员&#xff08;Cashier&#xff09;。订单从服务员开始&#xff0c;然后传递给厨师&#xff0c…

【数据结构】六、树和二叉树

目录 一、树的基本概念 二、二叉树 2.1二叉树的性质 2.2二叉树的存储结构 2.3遍历二叉树 先序遍历 中序遍历 后序遍历 层次遍历 2.4二叉树的应用 计算叶子数 前序遍历建树 根据序列恢复二叉树 计算树的深度 判断完全二叉树 三、线索二叉树 3.1线索化 四、树和森林…

哔哩哔哩HarmonyOS服务卡片开发

#HarmonyOS征文#完整服务卡片项目开发&#xff0c;为Bilibili添加服务卡片。 项目预览视频播放地址 介绍 这是一款纯鸿蒙版的哔哩哔哩服务卡片应用。 6月2日鸿蒙发布&#xff0c;今年的六月已经被鸿蒙刷屏了。从安卓到鸿蒙&#xff0c;最直观的变化应该就是服务卡片了。我也…

Shell三剑客:awk(awk编辑编程)四

一、Break 结束循环 Break 结束循环实例 break[n]&#xff1a;当第n次循环到来后&#xff0c;结束整个循环&#xff0c;n0就是指本次循环当计算的和大于 50 的时候使用 break 结束循环&#xff1a; [rootlocalhost ~]# awk BEGIN { > sum0; for(i0;i<20;i) { > …