天干:甲,乙,丙,丁,戊,己,庚,辛,壬,癸,总称为“十天干”.又分为5阳干,5阴干
地支:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥,总称为“十二地支",又分为6阳支,6阴支
甲为天干之始,子为地支之始,天干在上,地支在下,甲子相合,乙丑相合,其余顺次相合,就叫“甲子”。古代就是以甲子来纪年、纪月、纪日。
天干数为十,阴阳相合是五,地支数为十二,阴阳相合是六,天干周转六次,地支周转五次,合为六十甲子之数,故又称“六十甲子”.
甲子周期表:
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
算法思想:
甲子组合的规律是按干支原有的顺序,五个阳干与六个阳支相配,五个阴干与六个阴支配,结果便构成了六十个干支(或叫甲子)组合,为甲子一周 .观测上表可以发现,天干与地支的结合是顺序向下进行的,形成一个轮回,直到天干周转六次,地支周转五次.
算法实现:
typedef struct TgDz{ //定义天干地支数据结构
string name;
TgDz* link; //预定义的TgDz
}TgDz;
class JiaZiZhouQi{
TgDz TianGan[10],DiZhi[12];
string result[6][10];//甲子周期表
void InitiResult();
public:
JiaZiZhouQi();
void Display();
};
JiaZiZhouQi::JiaZiZhouQi(){ //初始化天干地支
TianGan[0].name="甲";
TianGan[0].link=&TianGan[1];
................初始化天干......................
TianGan[9].name="癸";
TianGan[9].link=&TianGan[0]; //形成一个单向循环链表
DiZhi[0].name="子";
DiZhi[0].link=&DiZhi[1];
................初始化地支......................
DiZhi[11].name="亥";
DiZhi[11].link=&DiZhi[0]; //形成单向循环链表
}
void JiaZiZhouQi::InitiResult(){
int counter=0;
TgDz *TGtemp,*DZtemp;
TGtemp=&TianGan[0];
DZtemp=&DiZhi[0];
while(counter<6){
for(int i=0;i<10;i++){
result[counter][i]=TGtemp->name+DZtemp->name;
TGtemp=TGtemp->link;
DZtemp=DZtemp->link;
}
++counter;
}
}
void JiaZiZhouQi::Display(){
InitiResult();
cout<<"甲子周期表:"<<endl;
for(int i=0;i<6;i++)
for(int j=0;j<10;j++){
cout<<result[i][j]<<"/t";
if(j==9)
cout<<endl;
}
}
用一个二维数组存放最后的结果.做个简单的测试:
int _tmain(int argc, _TCHAR* argv[]){
JiaZiZhouQi test;
test.Display();
return 0;
}
有了甲子周期表,用天干地支纪年、纪月、纪日就方便多了.
年干支推算法
中国很早就用干支纪年,并且沿用至今。有人把第一个甲子年定在公元前2696年,与公元相比较,公元4年的干支正是农历甲子年,因而将公元数减去3,再除以60(六十花甲子周期数),剩下的余数,可以用六十甲子表序数表查出公元该年的干支。其公式为:
(所求年数-3)/60 = 商..........余数(年干支序数)
如果余数等于0,则干支序数加上60。
例如:求公元1983年的农历干支年纪:(1983-3)/60 = 30......0,则 0+60 = 60(干支序数),查表为癸亥年。
月干支推算法:
年的天干为甲或已时,则正月的天干为丙;
年的天干为乙或庚时,则正月的天干为戊;
年的天干为丙或辛时,则正月的天干为庚;
年的天干为丁或壬时,则正月的天干为壬;
年的天干为戊或癸时,则正月的天干为甲。
首先推算出该年农历正月的天干,其余月份可按天干顺序号类推。该年正月的天干序号的计算为:取公元年份除以5的余数减2后乘以2再减1。当该数为负数时加10
例:求公元1991年(农历辛未年)正月的天干:1991/5=398余1,正月的天干序号数(1-2)X 2-1=-3,因该数是负数则加10得7,即天干序号7得出农历辛未年正月天干为庚,正月干支为庚寅。二月为辛卯,三月为壬辰,余类推
日干支推算法
由于农历月的大小没有一定的规律可循,这就使推算农历日期的纪日干支不能用一个简单的方法来实现。因此,农历日期的纪日干支比较好的推算办法是借助于历表
虽然农历的大小月不固定,而阴历除了每四年有一次闰月(二月)以外,每年的大,小月都固定不变,所以可以从阳历来推算当日的干支,其推算公式是:
日干=(元旦天干序数)+(所求日数)+(各月天干加减数,闰年三月后加1)/10
=商........余数(日干序数)
日支=(元旦地支序数)+(所求日数)+(各月天干加减数,闰年三月后加1)/12
=商........余数(地支序数)
按上述方法推算日干支,有两个数要先求出来才能代入公式中,即元旦干,支序数,各月干,支加减数。
天干地支加减数表:
每月天干地支常数加减表
平年 闰年
天干 地支 天干 地支
一月 减一 减一 减一 减一
二月 加零 加六 加零 加六
三月 减二 加十 加一 加一
四月 减一 加五 加一 加 一
五月 减一 减一 加一 加一
六月 加零 加六 加一 加一
七月 加零 加零 加一 加一
八月 加一 加七 加一 加一
九月 加二 加二 加一 加一
十月 加二 加八 加一 加一
十一月 加三 加三 加一 加一
十二月 加三 加九 加一 加一
注:本文参考自:http://topic.csdn.net/t/20050225/10/3805364.html中cityHost的介绍
地支:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥,总称为“十二地支",又分为6阳支,6阴支
甲为天干之始,子为地支之始,天干在上,地支在下,甲子相合,乙丑相合,其余顺次相合,就叫“甲子”。古代就是以甲子来纪年、纪月、纪日。
天干数为十,阴阳相合是五,地支数为十二,阴阳相合是六,天干周转六次,地支周转五次,合为六十甲子之数,故又称“六十甲子”.
甲子周期表:
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
算法思想:
甲子组合的规律是按干支原有的顺序,五个阳干与六个阳支相配,五个阴干与六个阴支配,结果便构成了六十个干支(或叫甲子)组合,为甲子一周 .观测上表可以发现,天干与地支的结合是顺序向下进行的,形成一个轮回,直到天干周转六次,地支周转五次.
算法实现:
typedef struct TgDz{ //定义天干地支数据结构
string name;
TgDz* link; //预定义的TgDz
}TgDz;
class JiaZiZhouQi{
TgDz TianGan[10],DiZhi[12];
string result[6][10];//甲子周期表
void InitiResult();
public:
JiaZiZhouQi();
void Display();
};
JiaZiZhouQi::JiaZiZhouQi(){ //初始化天干地支
TianGan[0].name="甲";
TianGan[0].link=&TianGan[1];
................初始化天干......................
TianGan[9].name="癸";
TianGan[9].link=&TianGan[0]; //形成一个单向循环链表
DiZhi[0].name="子";
DiZhi[0].link=&DiZhi[1];
................初始化地支......................
DiZhi[11].name="亥";
DiZhi[11].link=&DiZhi[0]; //形成单向循环链表
}
void JiaZiZhouQi::InitiResult(){
int counter=0;
TgDz *TGtemp,*DZtemp;
TGtemp=&TianGan[0];
DZtemp=&DiZhi[0];
while(counter<6){
for(int i=0;i<10;i++){
result[counter][i]=TGtemp->name+DZtemp->name;
TGtemp=TGtemp->link;
DZtemp=DZtemp->link;
}
++counter;
}
}
void JiaZiZhouQi::Display(){
InitiResult();
cout<<"甲子周期表:"<<endl;
for(int i=0;i<6;i++)
for(int j=0;j<10;j++){
cout<<result[i][j]<<"/t";
if(j==9)
cout<<endl;
}
}
用一个二维数组存放最后的结果.做个简单的测试:
int _tmain(int argc, _TCHAR* argv[]){
JiaZiZhouQi test;
test.Display();
return 0;
}
有了甲子周期表,用天干地支纪年、纪月、纪日就方便多了.
年干支推算法
中国很早就用干支纪年,并且沿用至今。有人把第一个甲子年定在公元前2696年,与公元相比较,公元4年的干支正是农历甲子年,因而将公元数减去3,再除以60(六十花甲子周期数),剩下的余数,可以用六十甲子表序数表查出公元该年的干支。其公式为:
(所求年数-3)/60 = 商..........余数(年干支序数)
如果余数等于0,则干支序数加上60。
例如:求公元1983年的农历干支年纪:(1983-3)/60 = 30......0,则 0+60 = 60(干支序数),查表为癸亥年。
月干支推算法:
年的天干为甲或已时,则正月的天干为丙;
年的天干为乙或庚时,则正月的天干为戊;
年的天干为丙或辛时,则正月的天干为庚;
年的天干为丁或壬时,则正月的天干为壬;
年的天干为戊或癸时,则正月的天干为甲。
首先推算出该年农历正月的天干,其余月份可按天干顺序号类推。该年正月的天干序号的计算为:取公元年份除以5的余数减2后乘以2再减1。当该数为负数时加10
例:求公元1991年(农历辛未年)正月的天干:1991/5=398余1,正月的天干序号数(1-2)X 2-1=-3,因该数是负数则加10得7,即天干序号7得出农历辛未年正月天干为庚,正月干支为庚寅。二月为辛卯,三月为壬辰,余类推
日干支推算法
由于农历月的大小没有一定的规律可循,这就使推算农历日期的纪日干支不能用一个简单的方法来实现。因此,农历日期的纪日干支比较好的推算办法是借助于历表
虽然农历的大小月不固定,而阴历除了每四年有一次闰月(二月)以外,每年的大,小月都固定不变,所以可以从阳历来推算当日的干支,其推算公式是:
日干=(元旦天干序数)+(所求日数)+(各月天干加减数,闰年三月后加1)/10
=商........余数(日干序数)
日支=(元旦地支序数)+(所求日数)+(各月天干加减数,闰年三月后加1)/12
=商........余数(地支序数)
按上述方法推算日干支,有两个数要先求出来才能代入公式中,即元旦干,支序数,各月干,支加减数。
天干地支加减数表:
每月天干地支常数加减表
平年 闰年
天干 地支 天干 地支
一月 减一 减一 减一 减一
二月 加零 加六 加零 加六
三月 减二 加十 加一 加一
四月 减一 加五 加一 加 一
五月 减一 减一 加一 加一
六月 加零 加六 加一 加一
七月 加零 加零 加一 加一
八月 加一 加七 加一 加一
九月 加二 加二 加一 加一
十月 加二 加八 加一 加一
十一月 加三 加三 加一 加一
十二月 加三 加九 加一 加一
注:本文参考自:http://topic.csdn.net/t/20050225/10/3805364.html中cityHost的介绍