农历一百年算法(1921~2021)【C语言代码】

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

计算某天是星期几【C代码】

农历算法简介以及公式

农历中天干地支的计算【C代码】

农历一百年算法(1921~2021)【C语言代码】

农历两百年算法(1901~2100)【C语言代码】


/*

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

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

*/

#include <time.h>

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值