强基初中数学&学Python——第四十六课 农历算法(课外)

'''

中国农历算法

 

    很多人只知道农历是用十天支(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和十二地干(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)相配对来标定的,但不知道相配的方法。本文对这相配的方法进行深入浅出的介绍,并制作成Python模块。

    首先要知道农历虽然用天支地干来标定,但并不是天支与地干的数学组合。事实上,天支和地干互不相干循环标识年份,这样天支年份的周期是10年;地干年份的周期是12年。

    其次,每过10的整数年,天支年份就和原来的一样;每过12的整数年,地干年份就和原来的一样。过610年就是60年,天支年份是原来的一样;过512年也是60年,地干年份是原来的一样。就是说天支地干年的周期是601012的最小公倍数)。

最后,农历历史悠久,具体从那年开始计算难以考究,但有一点是确定的,开始计算的那一年是甲子年。这样,每隔60年就会有一个甲子年。最近的甲子年对应的是公元1984年。这样就提供了一个简单的算法:公元年数减1984的差,除以10的余数(如为负数加10)对应天支年份(从0开始);除以12的余数(如为负数加12)对应地干年份(从0开始)。

 

'''

#一个甲子年

jz = 1984

#天支

tz = ['','','','','','','','','','']

#地干

dg = [('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('','')]

while True:

    try:

        gln = int(input("请输入查询年份的对应公元年份:"))

    except ValueError:

        print("请输入1个整数!")

        continue

    if gln<1 or gln>10000:

        print("请输入110000的整数!")

        continue   

    #与甲子年的差

    jzc = gln - jz

    #天支年份

    tzn = jzc % 10

    if tzn < 0:

       tzn += 10

    #地干年份

    dgn = jzc % 12

    if dgn < 0:

       dgn += 12

    #输出农历年份

    print("公元%d年对应的农历是%s%s年(%s年)。" % (gln, tz[tzn], dg[dgn][0], dg[dgn][1]))

 

'''

把这个文章全选复制到一个Python文件(.py)中运行,结果如下:

 

'''