C++算法系列之中国农历的算法C语言

图(1)没有闰月情况下朔日与冬至节气关系图

图中上排数字是公历月的编号,黑色圆点代表朔日,黑色三角形代表冬至节气。图(2)显示了2012年有闰月的情况下朔日和冬至的关系:

图(2)有闰月情况下朔日与冬至节气关系图

表(2)2011年朔望月与公历日期关系表

编号为1和2的两个朔日之间的朔望月是十一月,因为冬至节气落在这个朔望月,其它月的月名依次类推,正月的朔日就是春节。输出公历和农历双历时,以月(公历)为单位,从每月第一天开始,依次判断每一天属于哪个朔望月,确定这一天的农历月名,然后比较这一天和这个朔望月的朔日之间相差几天,记为农历日期。以2011年1月1日为例,这一天在2010年12月6日(2010年农历十一月的朔日)和2011年1月4日之间(2010年农历十二月的朔日),查表(1)可知对应的农历月是十一月,这一天和2010年12月6日相差26天,因此这一天的农历日期就是“廿七”。再以2011年2月3日(春节)这一天为例,查朔望月表得知2月3日属于从2月3日开始的朔望月,这个朔望月的月名是正月,而2月3日就是月首,农历日期是初一,正月初一就是春节。

5doubleCalculateSolarTerms(intyear,intangle);

8doubleCalculateMoonShuoJD(doubletdJD);

生成指定公历年份的公历和农历的双历年历的流程如下:

图(3)计算公农历双历年历的流程

voidCChineseCalendar::GetAllSolarTermsJD(intyear,intstart,double*SolarTerms){inti=0;intst=start;while(i<25){doublejd=CalculateSolarTerms(year,st*15);if(st==WINTER_SOLSTICE){year++;}st=(st+1)%SOLAR_TERMS_COUNT;}}start参数是节气的索引,定义二十四节气的索引如下:

图(5)演示程序的界面

小知识1:民间历法和历理历法

小知识2:通式寿星公式

“通式寿星公式”是前人整理出来的一个用于计算每年立春日期的经验公式:

Date=向下取整(Y*D+C)-L

其中,Y是年份,D的值是0.2422,C是经验值,取决于节气和年份,对于21世纪,立春节气的C值是4.475,春分节气的C值是20.646等等;

L是闰年数,其计算公式为:

L=向下取整(Y/4)-向下取整(Y/100)+向下取整(Y/400)

用“通式寿星公式”确定2011年立春日期的过程如下:

L=int(2011/4)–int(2011/100)+int(2011/400)=502–20+5=487

Date=int(2011×0.2422+4.475)-487=491–487=4

所以,2011年的立春日期是2月4日。

小知识3:计算节气和朔日的经验公式

F=365.242*(y–1900)+6.2+15.22*x-1.9*sin(0.262*x)

其中x是节气的索引,0代表小寒,1代表大寒,其它节气按照顺序类推。

计算从1900年开始第m个朔日的公式是:

M=1.6+29.5306*m+0.4*sin(1-0.45058*m)

小知识4:平朔和定朔

小知识5:正月初一和立春节气

立春是二十四节气之首,所以古代民间都是在“立春”这一天过节,相当于现代的春节(中国古代即是节气也是节日的情况很多,比如清明、冬至等等)。农历年从正月初一开始没有争议,但是农历生肖年从何时开始却一直有争议,目前多数人都认为“立春”节气是农历生肖年的开始。因为在中国古代历法中,十二生肖的计算与天干地支有很大关系,所以在“论天干地支、计算廿四节气”的情况下,“立春”节气应该是新生肖的开始。对于普通老百姓来说,习惯于认为正月初一是生肖年的开始,因此,正月初一和“立春”节气之间出生的小孩,在确定属相的时候就有点麻烦了。属龙还是属蛇?这是个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

THE END
1.回文日期c++回文日期c++ 描述 在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。 牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。https://blog.csdn.net/CHzhaohongrui/article/details/144094304
2.Android计算阴历mob64ca12d61d6b的技术博客在传统的中国文化中,阴历(农历)被广泛使用。阴历与阳历(公历)有着不同的计算方式,因此在 Android 开发中,计算阴历日期的应用场景较多。本文将介绍如何在 Android 中实现阴历的计算,并提供相应的代码示例,希望对读者有所帮助。 阴历与阳历的区别 阴历是以月亮的运动周期为基础的历法,每个月的长度为29或30天。而阳历https://blog.51cto.com/u_16213323/12699525
3.优选算法篇前缀之序,后缀之章:于数列深处邂逅算法的光与影分享给更多人:欢迎分享给更多对 C++ 感兴趣的朋友,一起学习前缀和的基础与进阶! 前言 前缀和是一种经典的算法技巧,用于高效地计算数组的某一区间内的元素和。它通过预处理一个前缀和数组,将区间求和的问题转化为常数时间的查询操作。本篇博客将详细讲解前缀和的原理,并结合题目解析,让大家掌握这一高效的算法方http://www.mzph.cn/web/57252.shtml
4.www.icodeclub.cn/status.php?user结束时间 : 2022-04-05 19:00:00 问题 提交 名次 OI名次 统计 IP验证 题目编号 用户 语言 结果 提交编号 用户 题目编号 结果 内存 耗时 语言 代码长度 提交时间 15813 stu202176 B 正确 2084 KB 0 ms C++ 279 bytes 2022-04-05 16:28:29 15773 stu202176 A 正确 2084 KB 0 ms C++ 243 byteshttp://www.icodeclub.cn/status.php?user_id=stu202176&cid=1015
5.一个比较全的C++农历算法(转)紫旭一个比较全的C++农历算法(转) 这以前本是一个MFC代码,我在这个基础上修改成了标准C++的.. 即可以在VC里用,也可以在C++Builder里用..所以一并放到这里来, 希望有人喜欢..喜欢的就给点鼓励啊~~示例代码: 代码:void__fastcall TForm1::Button1Click(TObject *Sender)https://www.cnblogs.com/15157737693zsp/p/9749343.html
6.C++实现公历转农历的算法CPPX的博客C++实现公历转农历的算法 由于C++语言诞生的比较早,所以不像.NET那样官方自带公历转农历的代码库,因此只能通过自己来实现今天是农历几月几日星期几的查询. 以下文件在linux g++ (GCC) 4.1.2 环境编译通过 //file: lunarday.h //author: cuichaox@gmail.comhttp://www.cppblog.com/ctou45/archive/2012/08/21/187846.aspx
7.源自许剑伟先生的寿星万年历农历核心算法类库(含源码),源自许剑伟先生的寿星万年历(v4.11),由 Javascript 源码改写为 C# 源码,在 Visual Studio 2008 中测试通过。强烈推荐您下载一份寿星万年历的源码进行对照参考。 真正的“万年”历,提供公元 -4712 年到公元 9999年 的日期查询功能,可让您告别查表算法。 事先声明一下,对于 C# 和 https://www.coder100.com/index/index/content/id/1022684
8.这是一款不错的农历转换成阴历的算法源代码这是一款不错的农历转换成阴历的算法源代码,它采用visual c++开发技术编写。,这是一款不错的农历转换成阴历的算法源代码https://download.eeworld.com.cn/detail/hellopinkgirls/463502
9.c++万年历课设(公农历可互查).pdfC/C++资料c++万年历课设(公农历可互查).pdf 17页内容提供方:ligennv1314 大小:366.38 KB 字数:约1.37万字 发布时间:2017-08-20发布于江西 浏览人气:88 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)c++万年历课设(公农历可互查).pdf 关闭预览 想预览更多内容,https://max.book118.com/html/2017/0820/129018842.shtm
10.一个简单高效的将公历(阳历)日期转化为农历(阴历)日期的算法一个简单、高效的将公历(阳历)日期转化为农历(阴历)日期的算法. Contribute to LS-KR/LunarMonthCalender development by creating an account on GitHub.https://github.com/LS-KR/LunarMonthCalender
11.Python实现公历(阳历)转农历(阴历)的方法示例详细介绍 sxtwl_cpp是一个的C++实现日历库。因为其依据天文历法算法实现,故其可查询范围广(BC722年以后与实历相符)。支持Android、IOS、Windows、MacOS、Linux等平台。使用swig暴露接口给python,lua,java等语言使用。 功能介绍 获取农历、公历以及天干地支数据 农历和阴历互转 回历的支持 真太阳时支持 行星历的支持 https://www.iteye.com/resource/weixin_38605144-12872429
12.阳历转化成农历法.docxC++中怎样将阳历转化成农历已关闭20[标签:C++,阳历,农历]小A角、2011-05-0311:06推荐答案一、原理篇公历转换农历的算法公历(GregorianCalendar)与农历(ChineseLunarCalendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。比较常用并且比较简单的公历转https://m.renrendoc.com/paper/308154963.html
13.国历和农历怎么转换6、国历与农历的换算公式 求教高人!!! 你指的是公历与农历的换算公式吧?这个算法复杂,我可以提供C或C++的API函数给你,不知道你是用什么语言来编的? 7、转换农历国历 网友分享:你好,国历1997.13,转换为农历是1997年1月7日,星星期四;国历1997.1,转换为农历是1996年12月24日,星期六。 https://www.105188.com/sh/618011.html