天干地支计年的算法


一、干支纪年法的介绍
干支纪年法是我国一种独特的传统纪年法,是中国文化的重要组成部分,大约从殷商开始沿用至今,在我国历史上得到广泛应用,有很多重要事件甚至以干支来命名,例如,甲午战争、戊戌变法、辛亥革命等等。但是,现在的大部分学生并不了解这种纪年法,在此,作一介绍,教师可以将其作为一节课外数学活动内容介绍给学生。
所谓干支,就是天干、地支的简称,具体如下:
十个天干
 1 2 3 4 5 6 7 8 9 10 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 十二个地支
 1 2 3 4 5 6 7 8 9 10 11 12 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 表1
天干与地支顺次循环搭配就得到六十干支:甲子、乙丑、丙寅、......,癸酉、甲戌、乙亥、丙子、......,癸亥。因其以甲子开头,故又称为六十甲子,列出如下:
表2
1
甲子 2
乙丑 3
丙寅 4
丁卯 5
戊辰 6
己巳 7
庚午 8
辛未 9
壬申 10
癸酉 11
甲戌 12
乙亥 13
丙子 14
丁丑 15
戊寅 16
己卯 17
庚辰 18
辛巳 19
壬午 20
癸未 21
甲申 22
乙亥 23
丙戌 24
丁亥 25
戊子 26
己丑 27
庚寅 28
辛卯 29
壬辰 30
癸巳 31
甲午 32
乙未 33
丙申 34
丁酉 35
戊戌 36
己亥 37
庚子 38
辛丑 39
壬寅 40
癸卯 41
甲辰 42
乙巳 43
丙午 44
丁未 45
午申 46
己酉 47
庚戌 48
辛亥 49
壬子 50
癸丑 51
甲寅 52
丁卯 53
丙辰 54
丁巳 55
戊午 56
己未 57
庚申 58
辛酉 59
壬戌 60
癸亥 按照表2中次序,每年用一对干支表示,从甲子开始到癸亥结束一个循环,然后又是甲子,如此循环不断,俗语中有"日月运转,甲子轮回",就是说的这个意思,这种纪年法就是"干支纪年法"。
二、干支纪年法与公元纪年法的换算及算法设计
目前,我们一般使用世界上通用的公元纪年法,那么,怎样把公元纪年换算为干支纪年呢?比如今年是2005年,用干支纪年法如何表示呢?
在表1中,可以看出,在一个循环的60年中,第1年是甲子,第11年是甲戌,第21年是甲申,......,即第一列必是甲某年,第二列必是乙某年,也就是凡个位数是1的必是甲某年,个位数是2的必是乙某年,以此类推。同理,第1年是甲子年,第13(=12+1)年是丙子,第25(=2*12+1)年是戊子,......,凡被12除余数是1的必是某子年,余数是2的是某丑年,以此类推。
据此,可以得到有公元纪年到干支纪年的换算方法,如果要计算公元N年的干支,可以按如下步骤计算:
Ⅰ.计算N′=N-3 (因为公元4年是甲子

年,所以公元4年可以作为甲子的开始)
Ⅱ.计算 R=N′(mod60) (干支纪年60一循环,所以先减掉60的倍数,方便计算)
Ⅲ.计算T=R(mod10) D=R(mod12)
把得到的数字T、D在表1中对应的天干与地支合并起来就得到所求的干支,若T=0,则对应数字为10,即天干为癸,若D=0,则对应地支亥。
上述步骤中,Ⅱ可以省略;或者省略Ⅲ,得到R后,找到其在表2中对应的干支即为所求。在这里,好像N只能取公元4年以后的值,那么公元4年以前的干支怎么办呢?天文纪年法规定,公元元年记为+1年,公元前1年记为0年,公元前2年记为-1年,......,以此类推,N按这个方法取值再计算。
换算步骤C语言程序表示如下:
main( )
{
int n,m,r,t,d;
printf("\n 请输入要换算的年份: ");
scanf("%d",&n);
if(n<0)
n=n+1;
m=n-3; if(m<=0) m=m+60;
r=m%60;
t=r%10;
d=r%12;
printf("t=%3d,d=%3d",t,d);
if(t<=o) t=t+10;
if(d<=0) d=d+12;
switch(t)
{case1:printf("甲");break;
case2:printf("乙");break;
case3:printf("丙");break;
case4:printf("丁");break;
case5:printf("戊");break;
case6:printf("己");break;
case7:printf("庚");break;
case8:printf("辛");break;
case9:printf("壬");break;
case10:printf("癸");break;
}
switch(d)
{ case1:printf("子");break;
case2:printf("丑");break;
case3:printf("寅");break;
case4:printf("卯");break;
case5:printf("辰");break;
case6:printf("巳");break;
case7:printf("午");break;
case8:printf("未");break;
case9:printf("申");break;
case10:printf("酉");break;
case11:printf("戌");break;
case12:printf("亥");break;
}
}
在具体运用干支纪年法时,要注意春节的日子,拿2005年来说,2月9日是"年初一",这时才算是已酉年,而从2004年1月1日到2月8日,还是属于甲申年的,所以笼统地说2005年是已酉年并不准确,不过春节前的日子很短,习惯上默认是指春节后的干支。
三、提炼数学模型,培养学生的数学建模能力
在干支纪年法和公元纪年法的换算分析中,经历了如下几个环节:







而这个过程恰是数学建模中分析解决问题的三个重要步骤。数学建模是指将现实问题简化、抽象为一个数学问题或者数学模型,然后采用恰当的饿数学方法求解,进而对现实问题进行定量分析和研究,最终达

到解决实际问题的目的。数学建模的过程能够使学生真正感受到数学知识理论与实践的结合,体现了学以致用的原则,能够促进学生各学科的全面发展,提高学生运用现代化工具的能力,培养学生严谨、求实的科学态度和协作、创新的精神。高职数学教学正在向以培养学生的数学素养为目标的能力教育转变,在这种转变过程中,作为高等数学的拓展课程--数学建模的教学显得尤为重要。但是,提高学生的数学建模能力是一个比较复杂的过程,所以,要循序渐进,从简入难,先给学生一些简单的比较容易解决的问题去练习,要在平时的教学中,把数学教学和数学建模有机地结合起来。
实际上,高等数学的许多教学内容中都可以引入相应的数学模型,如函数应用问题中,引入"复利、助学贷款"等实际生活中的例子;导数、微分、积分及其应用中,可编制"商品存储费用优化问题,磁盘最大存储量、交通管理中的红灯、黄灯、绿灯亮的时间问题、洗衣机的节水问题"等;概率统计问题中,可插入彩票问题、报童卖报策略问题等。
总之,在高职数学教学中,可以根据学生的特点以及不同的教学内容,编制不同的数学模型进行教学,既可以激发学生对数学的学习兴趣,活跃课堂气氛,又可以增强学生的数学应用意识,培养学生应用知识和计算机技术解决实际问题的能力,能够使学生能够体会到应用数学知识解决实际问题的乐趣,促使学生摆脱数学乏味论的思想,并自觉地应用数学知识和方法去观察和解决生活、生产和科技中的问题,使其由知识型向能力型转化,全面提高他们的数学素质,真正实现高职高专教学改革的目标。

参考文献
[1] 梁宗巨.数学历史典故[M].沈阳:辽宁教育出版社.1995.
[2] 谈祥柏.数学与文史[M].上海:上海教育出版社.2002.
[3] 张顺燕.数学的思想、方法和应用[M].北京:北京大学出版社.1997.



??

??

??

??

教育教学研究与实践

作者简介:王伟伟 女 理学硕士 基础部助教




相关文档
最新文档