2023-05-04 19:41 采纳率: 40%
浏览 24

阳历转农历时月份和日期出错,求解答,可有偿

这个是该部分运行的结果

img


实际的日期

img


下面是农历部分代码


/*************************************************************************************
*   函数名:农历查询
*   入口参数:year,month,day
*   调用函数:
*************************************************************************************/
void Lunar_Calendar(int year ,int month,int day) {
    /*天干名称*/
    const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
    /*地支名称*/
    const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午",
                            "未","申","酉","戌","亥"
                           };
    /*属相名称*/
    const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇",
                               "马","羊","猴","鸡","狗","猪"
                              };
    /*农历日期名*/
    const char *cDayName[] = {"*","初一","初二","初三","初四","初五",
                              "初六","初七","初八","初九","初十",
                              "十一","十二","十三","十四","十五",
                              "十六","十七","十八","十九","二十",
                              "廿一","廿二","廿三","廿四","廿五",
                              "廿六","廿七","廿八","廿九","三十"
                             };
    /*农历月份名*/
    const char *cMonName[] = {"*","正","二","三","四","五","六",
                              "七","八","九","十","十一","腊"
                             };
    /*公历每月前面的天数*/
    const int wMonthAd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
    /***************************************************************
    *农历数据计算方式:用十进制保存
    *例如:1、农历每个月的大小;2、今年是否有闰月,闰几月以及闰月的大小。
    用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大
    小,大月记为1,小月记为0,这样就用掉12位(无闰月)或13位(有闰月),再
    用高4位来表示闰月的月份,没有闰月记为0。比如说,2000年的信息数据是是0xC96
    化为十进制就是3222,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小
    ****************************************************************/
    /*农历数据*/
    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;
    char szNongli[30], szNongliDay[10],szShuXiang[10];
    /*—取当前公历年、月、日—*/
    wCurYear = year;
    wCurMonth = month;
    wCurDay = day;
    /*—计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)—*/
    /*1921年 鸡年 辛酉年*/
    nTheDate = (wCurYear-1921) * 365 + (wCurYear-1921) / 4 + wCurDay + wMonthAd[wCurMonth-1]-38;
    if((!(wCurYear % 4)) && (wCurMonth > 2)) //如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加1
        nTheDate = nTheDate + 1;
    /*–计算农历天干、地支、月、日—*/
    nIsEnd = 0;
    m = 0;
    while(nIsEnd != 1) {
        if(wNongliData[m] < 4095) //4095:111111111111 判断是否有闰月  小于则没有闰月 扣掉一个月
            k = 11;
        else
            k = 12;
        n = k;
        while(n>=0) {
            //获取wNongliData(m)的第n个二进制位的值
            nBit = wNongliData[m];
            for(i=1; i<n+1; i++) //大小月确定
                nBit = nBit/2;
            nBit = nBit % 2; //取出农历数据前12位的二进制数据
            if (nTheDate <= (29 + nBit)) { //若为1则是大月 天数有30天
                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;
    }
    /*–生成农历天干、地支、属相 ==> wNongli–*/
    /************************************************************************
    * 计算公式: 天干:(农历年份-3)Mod 10
    * 地支:(农历年份-3)Mod 12
    * 生肖:(Year-3) Mod 12
    ************************************************************************/
    printf(" %s年 ",cShuXiang[(wCurYear - 4) % 12]);//属相
    printf("%s",cTianGan[(wCurYear - 4)  % 10]);//天干
    printf("%s年 ",cDiZhi[(wCurYear - 4) % 12]);//地支
    /*–生成农历月、日 ==> wNongliDay–*/
    if (wCurMonth < 1) { //闰月
        printf("闰");
        printf("%s",cMonName[-1 * wCurMonth]);//农历月份确定
        printf("月");
        printf("%s",cDayName[wCurDay]);//农历日期确定
        printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));//星期的确定
    } else {
        printf("%s",cMonName[wCurMonth]);
        printf("月 ");
        printf("%s",cDayName[wCurDay]);
        printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));
    }
}

谢谢!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-05 04:17
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7617938
    • 你也可以参考下这篇文章:简单题日常六.巨型整数(不要以为这题需要用字符串的复杂方法输入数据)
    • 除此之外, 这篇博客: 优越数语言中的 给定3个数,如果有两个数大于他们的平均数则称这组数为优越数。(定义纯属虚构) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      Input

      输入第一行是一个整数: 表示测试数据的组数。

      对于每组测试数据,仅一行3个整数。
      Output

      对于每组输入数据输出一行,判断它是否为一组优越数,如果是输出“Yes”(输出不包括引号),否则输出“No”。
      答案
      #include<stdio.h>
      int main()
      {
      int a, b, c, k;
      double i;
      scanf("%d", &k);
      while(k–)
      {
      scanf("%d %d %d", &a, &b, &c);
      i=(a+b+c)/3.0;
      if(a>i&&b>i||b>i&&c>i||a>i&&c>i)
      printf(“Yes\n”);
      else
      printf(“No\n”);
      }
      return 0;
      }
      总结:
      1.第一行输入组数利用while循环(k–)表示输入k一个值,当k减到0时,停止循环。
      2.取优越数时,可利用if语句,见收藏“优越数”。

    • 您还可以看一下 程媛媛老师的期货量化交易麦语言编程中级课程中的 日内交易模型编写要点小节, 巩固相关知识点

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 5月4日
  • 创建了问题 5月4日

悬赏问题

  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了