中华农历论坛知识讨论区历法知识 → 怎样将 干支序数 转为 六十甲子序数?


  共有34738人关注过本帖树形打印

主题:怎样将 干支序数 转为 六十甲子序数?

帅哥哟,离线,有人找我吗?
zyl910
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:329 威望:0 精华:0 注册:2007/4/10 15:40:00
怎样将 干支序数 转为 六十甲子序数?  发帖心情 Post By:2007/4/13 13:54:00

人能很容易看懂干支汉字,但对于计算机处理而言,还是使用数字序数比较好。
“六十甲子的序数 换算成 干/支的序数”是很简单的。但反过来“干支的序数 换算成 六十甲子的序数”我就不知道怎么算了。

规范化:
天干(iGan):(0~9)甲乙丙丁戊己庚辛壬癸
地支(iZhi):(0~11)子丑寅卯辰巳午未申酉戌亥
六十甲子(i):(0~59)甲子、乙丑、丙寅、丁卯、……庚申、辛酉、壬戌、癸亥


六十甲子 换算 干支:
iGan = i mod 10
iZhi = i mod 12


干支 换算 六十甲子:
i = 怎么算(iGan,iZhi)


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
cntiger
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:14 积分:575 威望:0 精华:0 注册:2007/3/28 10:57:00
这样算  发帖心情 Post By:2007/4/13 23:11:00

这倒是个简单的问题,眨两下眼睛就想出来了:

i=MOD((((10-iGan-iZhi)/2+1)*10+iGan*11),60)


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
cntiger
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:14 积分:575 威望:0 精华:0 注册:2007/3/28 10:57:00
在VB/C/C++/Java/JS的表达  发帖心情 Post By:2007/4/13 23:37:00

以上是Excel中的表达法。在VB中为:

i = (((10 - iGan - iZhi) / 2 + 1) * 10 + iGan * 11) Mod 60

在C/C++/Java/JS中的表达:

i = (((10 - iGan - iZhi) / 2 + 1) * 10 + iGan * 11) % 60


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zyl910
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:329 威望:0 精华:0 注册:2007/4/10 15:40:00
  发帖心情 Post By:2007/4/16 9:41:00

谢谢楼上!

这两天我狂翻数论,终于自己推导出来了,只不过没有楼上的简洁。
但我的算法有一个优点:当干支阴阳不一致时,能够以天干(或地支)为准,即至少有一个汉字正确。
iGan: 1 //乙
iZhi: 2 //寅
My_A: 51 //乙卯
My_B: 50 //甲寅
cntiger: 56 //庚申

干支 换算 六十甲子:
if (iGan mod 2) = (iZhi mod 2) then // 必须阴阳相同
    i = 2*((floor(iGan/2)*6 + floor(iZhi/2)*25)mod 30) + (iGan mod 2)
end if


原理:
  由于10、12不是互质的数,所以不能直接用中国余数定理(孙子定理)求解。
  10、12的最大公约数为2,所以可将2个看成同一段。这样将题目化为求解关于5、6的线性同余方程组:
x≡b1(mod 5)
x≡b2(mod 6)

除5外的数是6,6*1≡1(mod 5)
除6外的数是5,5*5≡1(mod 6)
所以 x = (b1*6 + b2*25) mod 30

  再考虑分段,所以最终公式为:
i = 2*((floor(iGan/2)*6 + floor(iZhi/2)*25)mod 30) + (iGan mod 2) // 当干支阴阳不一致时,以天干为准

i = 2*((floor(iGan/2)*6 + floor(iZhi/2)*25)mod 30) + (iZhi mod 2) // 当干支阴阳不一致时,以地支为准

  这也许就是为什么干支分阴阳的原因吧。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
cntiger
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:14 积分:575 威望:0 精华:0 注册:2007/3/28 10:57:00
  发帖心情 Post By:2007/4/16 23:02:00

楼主的功力果然了得,打蚊子调来了二炮兵团!你要是再翻几天的数论,可能哥德巴赫猜想的1+1要被你攻破了!

不过我有一点不明白,为什么要一个天干和地支阴阳不同的条件呢?六十甲子中天干和地支的序号要么都是偶数,要么都是奇数,不可能一个是偶数另一个为奇数。现在用LZ的这个方法倒好了,给定一个奇数一个偶数的不可能出现的组合也会得到一个答案,这样的答案有什么意义呢?愚以为,如果给出一个不可能出现的组合,应该明确给出“不可能”的提示,而不是胡乱给一个没有意义的答案。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zyl910
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:329 威望:0 精华:0 注册:2007/4/10 15:40:00
  发帖心情 Post By:2007/4/17 18:01:00

不要说得这么明白嘛

提这些优点只是为了安慰自己,这几天的功夫没有白费


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
winsky
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:12 积分:364 威望:0 精华:0 注册:2007/3/14 9:35:00
眨了一千下眼睛也没想出来  发帖心情 Post By:2007/4/22 10:03:00

2楼和3楼的cntiger好厉害呀,我喜欢你的简洁的表达式。请问你是如何推导出来的?能不能在这里贴一下推导过程?你眨两下眼睛就想出来了,我眨了一千下也没想出来啊!

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
zyl910
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:18 积分:329 威望:0 精华:0 注册:2007/4/10 15:40:00
  发帖心情 Post By:2007/4/23 9:45:00

找到更简洁的公式了:
i=MOD(12+iGan-iZhi,12)*5+iGan

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
ang340303580
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:63 积分:475 威望:0 精华:0 注册:2007/4/27 19:43:00
  发帖心情 Post By:2007/4/27 19:57:00

图片点击可在新窗口打开查看

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hiteyun
  10楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:381 积分:2141 威望:0 精华:0 注册:2009/5/1 23:57:00
  发帖心情 Post By:2009/5/22 22:57:00

心算公式:
i=iGan*6-iZhi*5
若为负,则加60。

机器算用:
i=MOD(iGan*6-iZhi*5,60)

命甲子算外、命甲子算上通用(命甲子算上则0记为60即可)

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 14 1 2 下一页

返回版面帖子列表

怎样将 干支序数 转为 六十甲子序数?








签名