C语言版-农历算法

这个只是基本的农历算法,另外的节日查询啊,可以自己做的。到网站找一个万年历,改写成C语言的就可以了。 char *GetDayOf(SYSTEMTIME pSt) { const char *cTianGan[] = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}; const char *cDiZhi[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; const char *cShuXiang[] = {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"}; const char *cDayName[] = {"*", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"}; const char *cMonName[] = {"*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"}; const int wMonthAdd[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; const int wNongliData[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 }; static int wCurYear, wCurMonth, wCurDay; static int nTheDate, nIsEnd, m, k, n, i, nBit; TCHAR szNongli[512], szNongliDay[512]; wCurYear = pSt.wYear; wCurMonth = pSt.wMonth; wCurDay = pSt.wDay; nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38; if ((!(wCurYear % 4)) && (wCurMonth > 2)) nTheDate = nTheDate + 1; nIsEnd = 0; m = 0; while (nIsEnd != 1) { if (wNongliData[m] < 4095) k = 11; else k = 12; n = k; while (n >= 0) { nBit = wNongliData[m]; for (i = 1;i < n + 1;i++) nBit = nBit / 2; nBit = nBit % 2; if (nTheDate <= (29 + nBit)) { nIsEnd = 1; break; } nTheDate = nTheDate - 29 - nBit; n = n - 1; } if (nIsEnd) break; m = m + 1; } wCurYear = 1921 + m; wCurMonth = k - n + 1; wCurDay = nTheDate; if (k == 12) { if (wCurMonth == wNongliData[m] / 65536 + 1) wCurMonth = 1 - wCurMonth; else if (wCurMonth > wNongliData[m] / 65536 + 1) wCurMonth = wCurMonth - 1; } wsprintf(szNongli, "%s%s年 (%s年) ", cTianGan[((wCurYear - 4) % 60) % 10], cDiZhi[((wCurYear - 4) % 60) % 12], cShuXiang[((wCurYear - 4) % 60) % 12]); if (wCurMonth < 1) wsprintf(szNongliDay, "闰%s月", cMonName[ -1 * wCurMonth]); else wsprintf(szNongliDay, "%s月", cMonName[wCurMonth]); strcat(szNongliDay, cDayName[wCurDay]); return strcat(szNongli, szNongliDay); }   转:http://www.shuax.com/?p=20
posted @ 2012-07-16 15:05  adodo1  Views(400)  Comments(0Edit  收藏  举报