C语言农历天干地支,农历一百年算法(1921~2021)【C语言代码】

【本程序在DEV C++ 4.9.9.2 下编译通过】

有关农历的东西有以下几篇文章:

/*

下面是网上一个非常流行的计算农历的算法和C代码。但是,它只能计算

1921年 到 2021年的农历,仅仅只有一百年。稍后,我将会帖出。

*/

#include

intLunarCalendar(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] = "";

#if0

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");}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值