如何算出十二生肖?
首先,通过排列组合我们可以知道,12生肖共有720种组合方式(子鼠、丑牛等除外)。那么,如果要把这720种情况数出来,当然最简单直接的办法就是枚举法。但是720个数字可不是一个小数目,而且要一遍又一遍地重复计算。那有没有一种更方便的计算方法呢?当然有!事实上,只要把问题转化为数学中著名的“抽屉原理”即可解决。 简单来讲,“抽屉原理”可以描述为: “如果每个抽屉里不超过2个数,那么一定有一个抽屉里有3个数。” 如果把720个人看作是一个一个大屉(也就是说每个人视为一个抽屉),那么只要验证每个大屉里的数字是否都小于等于2个,就可以证明所有的大屉里至少有1个里有3个数字。
接下来就简单了,我们只需要把所有的12生肖按照一定的顺序排成一个长长的数列,然后每一对相邻的生肖组成一个大屉,这样我们就将原问题转为了“每个大屉里的数字是否都小于等于两个”的问题。因为60个阴历月里含有52个大小各异的满月(其中每月均有30天的有8个月,每月均不足30天的6个月),而每次满月时我们都会新增一个农历节日,当经过60个阳历年后,我们将迎来60个不同的农历节气以及60个不同的节日,也就是60对相邻的月份和日期。这时,根据抽屉原理我们知道,一定有一个月的闰日(该月有两个农历节)多于2个。只要把60个农历节气和节日中最大的那个闰日找出来,我们就可以得到答案是哪一个月出现闰日多了的情况。
下面我们来具体看看怎么操作。 我们把12生肖按顺序排列成一组组数据: 子鼠 丑牛 寅虎 卯兔.... 午马 未羊 申猴 酉鸡... 亥猪 如此,每两组数据就是一年,共60组。而每组数据的前面部分代表的是农历的月份的节气,后面部分代表的是农历节的日期。每个月的节气都是固定的,从第1组的春分开始,到第60组的秋分结束。而每个月的农历节都是在农历月中出现的,所以只有月末某一天,而这一天就是农历的月小,比如清明、立夏等。
现在我们把12个生肖两两搭配构成60对数据,然后把60对数据分成60段,每一段分别统计其包含的数据的个数,如果我们发现某一段的数据个数超过2个,那么就说明这一段包含了某个闰日,而这个闰日就是多出来的那个。 例如,我们统计第一段的个数(第一个数据和第二个数据之和),由于第一个数据2个,第二个数据4个,所以相加一共是6个,而第三段的个数刚好比第二段少1(第四个数据和第五个数据之和比第三个数据少1),以此类推。最后我们发现,共有60个数据的这段包含了所有的闰日,也就是这段的第一个数据(也就是上半年最长的一天)必然是闰日。我们找到了这个万年不易的闰日,也就算出了十二生肖的时间。