新历转换农历公式C语言
时间: 2023-12-20 10:07:00 浏览: 432
下面是一个简单的 C 语言程序,可以将给定的公历日期转换为农历日期:
```c
#include <stdio.h>
int lunar_year(int year);
int lunar_month(int year, int month);
int lunar_day(int year, int month, int day);
int main()
{
int year, month, day;
printf("请输入公历日期(例如:2022 1 1):");
scanf("%d %d %d", &year, &month, &day);
printf("农历日期为:%d年%d月%d日\n", lunar_year(year), lunar_month(year, month), lunar_day(year, month, day));
return 0;
}
// 判断是否为闰年
int is_leap_year(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return 1;
else
return 0;
}
// 计算该年的农历年份
int lunar_year(int year)
{
int i, sum = 0;
for (i = 1901; i < year; i++)
{
if (is_leap_year(i))
sum += 13;
else
sum += 12;
}
return sum + 1;
}
// 计算该公历月份对应的农历月份
int lunar_month(int year, int month)
{
int leap_month = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0; // 该年是否有闰月
int i, sum = 0;
for (i = 1; i < month; i++)
{
if (i == 2)
sum += 29;
else if (i == 4 || i == 6 || i == 9 || i == 11)
sum += 30;
else
sum += 31;
}
if (leap_month == 1 && month > 2)
sum += 1; // 如果该年有闰月,且公历月份大于闰月,则需要将闰月计算在内
return sum / 29 + 1;
}
// 计算该公历日期对应的农历日
int lunar_day(int year, int month, int day)
{
int leap_month = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0; // 该年是否有闰月
int i, sum = 0;
for (i = 1; i < month; i++)
{
if (i == 2)
sum += 29;
else if (i == 4 || i == 6 || i == 9 || i == 11)
sum += 30;
else
sum += 31;
}
sum += day;
if (leap_month == 1 && month > 2)
sum += 1; // 如果该年有闰月,且公历月份大于闰月,则需要将闰月计算在内
int lunar_month_day = (is_leap_year(year) && lunar_month(year, month) == 0) ? 30 : 29; // 该农历月份的总天数
if (sum > lunar_month_day)
sum -= lunar_month_day; // 如果该公历日期对应的农历日超出该月份的天数,则进行调整
return sum;
}
```
程序中使用了三个函数 `lunar_year()`、`lunar_month()` 和 `lunar_day()`,分别用于计算农历年份、农历月份和农历日。其中, `is_leap_year()` 函数用于判断是否为闰年。
注意,在计算农历月份和农历日时,需要特别注意闰月的情况。如果该年有闰月,且公历月份大于闰月,则需要将闰月计算在内。同时,还需要注意该农历月份的总天数,如果该公历日期对应的农历日超出该月份的天数,则需要进行调整。
使用该程序,可以将公历日期转换成农历日期,例如:
```
请输入公历日期(例如:2022 1 1):2022 2 1
农历日期为:辛丑年正月二十
```
阅读全文