淡泊明志 宁静致远
分类: C/C++
2006-11-14 10:52:52
【本程序在DEV C++ 4.9.9.2 下编译通过】
有关农历的东西有以下几篇文章:
/*
下面是网上一个非常流行的计算农历的算法和C代码。但是,它只能计算
1921年 到 2021年的农历,仅仅只有一百年。稍后,我将会帖出农历两百年算法(1901~2100)【C语言代码】。
*/
#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;
//计算从1921年2月8日(正月初一)到现在所经历的天数。
DateCount = (year - 1921) * 365 + (year - 1921) / 4 + MonthAdd[month - 1] - 38 + day;
//如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加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日\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");