1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

C语言版-农历算法

本帖由 admin2011-11-21 发布。版面名称:应用交流

  1. admin

    admin 管理员 管理成员

    注册:
    2011-11-01
    帖子:
    3,671
    赞:
    2,425
    这个只是基本的农历算法,另外的节日查询啊,可以自己做的。到网站找一个万年历,改写成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);
    }
    
     
正在加载...