Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1408154
  • 博文数量: 143
  • 博客积分: 10005
  • 博客等级: 上将
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-23 17:25
个人简介

淡泊明志 宁静致远

文章分类

全部博文(143)

文章存档

2011年(2)

2009年(1)

2007年(22)

2006年(118)

我的朋友

分类: C/C++

2006-11-14 10:52:52

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

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

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

农历算法简介以及公式

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

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

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

/*

  下面是网上一个非常流行的计算农历的算法和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");

}
阅读(8168) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~