|
#include int LunarCalendar(int year,int *pmonth,int *pday) { const int MonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334}; const int LunarCalendarTable[100] ={ 2635,333387,1701,1748,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413 ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031 ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222 ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709 ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
int DateCount,loop; int i,j,n,Bit; int month,day; month = *pmonth; day = *pday; //計(jì)算從1921年2月8日(正月初一)到現(xiàn)在所經(jīng)歷的天數(shù)。 DateCount = (year - 1921) * 365 + (year - 1921) / 4 + MonthAdd[month - 1] - 38 + day; //如今年陽(yáng)歷是閏年(2月有29天),而且當(dāng)前月份大于2月,經(jīng)歷的總天數(shù)加1。 if((!(year % 4)) && (month > 2)) DateCount = DateCount + 1; //下面是查表的算法。 loop = 1; j = 0; while(loop) { if(LunarCalendarTable[j] < 4095) i = 11; else i = 12; n = i; while(n>=0) { Bit = LunarCalendarTable[j]; Bit = (Bit >> n) & 1; if (DateCount <= (29 + Bit)) { loop = 0; break; } DateCount -= 29 + Bit; n--; } if(!loop) break; j++; } year = 1921 + j; month = i - n + 1; day = DateCount; if (i == 12) { if (month == LunarCalendarTable[j] / 65536 + 1) { month = 1 - month; } else if (month > LunarCalendarTable[j] / 65536 + 1) month--; } *pmonth = month; *pday = day; return 1; } main() { const char *ChDay[] = {"*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"}; const char *ChMonth[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","臘"}; struct tm * Local; long t; int year,month,day; char str[13] = "";
#if 0 t = time(NULL); Local = localtime(&t); year = Local->tm_year + 1900; month = Local->tm_mon + 1; day = Local-> tm_mday; #else year = 2006; month = 1; day = 1; #endif printf("%d年%d月%d日\(chéng)t",year,month,day); LunarCalendar(year,&month,&day); if(month < 0) { strcat(str,"閏"); strcat(str,ChMonth[-month]); } else strcat(str,ChMonth[month]); strcat(str,"月"); strcat(str,ChDay[day]); puts(str); system("pause"); } 節(jié)氣的計(jì)算 先給節(jié)氣進(jìn)行編號(hào),從近日點(diǎn)開始的第一個(gè)節(jié)氣編為0,編號(hào)如下及其相應(yīng)的月份如下:
0 小寒 臘月
6 清明 三月
12 小暑 六月
18 寒露 九月
1 大寒 臘月
7 谷雨 三月
13 大暑 六月
19 霜降 九月
2 立春 正月
8 立夏 四月
14 立秋 七月
20 立冬 十月
3 雨水 正月
9 小滿 四月
15 處暑 七月
21 小雪 十月
4 驚蟄 二月
10 芒種 五月
16 白露 八月
22 大雪 冬月
5 春分 二月
11 夏至 五月
17 秋分 八月
23 冬至 冬月
把當(dāng)天和1900年1月0日(星期日)的差稱為積日,那么第y年(1900年算第0年)第x 個(gè)節(jié)氣的積日是 F = 365.242 * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x) 這個(gè)公式的誤差在0.05天左右。 二、朔日的計(jì)算 從1900年開始的第m個(gè)朔日的公式是 M = 1.6 + 29.5306 * m + 0.4 * sin(1 - 0.45058 * m) 這個(gè)公式的誤差在0.2天左右。 三、年份的確定 1864年1月0日是農(nóng)歷癸亥年,所以用當(dāng)年減去1864,用10除得的余數(shù)作為年份天干的,用12除得的余數(shù)作為年份的地支,數(shù)字對(duì)應(yīng)的天。 |