甲子周期表c++实现

来源:互联网 发布:乎的反义词是什么 编辑:程序博客网 时间:2024/04/28 06:12
      天干:甲,乙,丙,丁,戊,己,庚,辛,壬,癸,总称为“十天干”.又分为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的介绍