I haven't seen it carefully, the code is found online.
: ------------------------------------------------- -------------------------------
[Benpian full text] [Reply to this article] [Benpian Author: top] [Benpian Popularity: 10]
Sender: TOP (English Level 6 && PHP), News District: Programming
Title: Yin and Yang Calendar Algorithm
Sending station: Yan Zhao BBS (Tue Apr 8 12:14:16 2003), transfer
Http://linux.tcpip.com.cn
Yin Yang calendar algorithm
Speaker: Kent speech time: 2001-11-08 12:03:11
The program is:
/ *
Prototype: int Calconv (STRUCT Convdate *);
Struct convdate
{
Int source; == 0 Enter the date in the record,! = 0 Enter is a lunar calendar
Int Solaryear; Western Medicine Output or Enter
Int Solarmonth; Vehcoon
Int solardate;
INT Lunaryear; Output or Enter Lunar New Year
Int lunarmonth; lunar month
Int lunarmonth; lunar month
Int Lunardate; Lunar New Year
Int weekday; this day is the day of the week (0 == Sunday, 1 == Monday, ...)
Int kan; day dry (0 == A, 1 == B, ..., 9 ==)
Int Chih; this day of the day (0 ==), 1 == Ugly, ..., 11 == Hai)
}
When the call is required to set the value of the Souce, if it is 0, it is a recorded lunar calendar. Otherwise, it will turn the Lunar Calendar. Then depend
Enter the annual day of the contraman or lunar calendar to set the monkey or lunar calendar. The year and month after the conversion will be filled in the structure (agriculture
Calendar or Western calendar, and the day is a day, and the sky is branched.
If the function of the function is 0, there is no error, 1 is an incorrect error, 2 is incorrectly in the input month.
,
3 For the input date error.
Input weeks must be in 1937 - 2031
Enter the lunar calendar year must be in 1936 - 2030
If you need to expand, then lunarcal is added.
* /
#define first year 1936 / * The first year in lunarcal [] * /
Struct convdate
{
Int source;
Int source;
Int Solaryear;
Int solarmonth;
Int solardate;
Int Lunaryear;
Int lunarmonth;
Int Lunardate;
Int weekday;
Int kan;
Int chih;
}
Struct Taglunarcal
{
Int basedays; / * to the Western 1st to the number of days in the first day of the lunar calendar * /
INTITERCALATION; / * Take the month. 0 == There is no leap in this year * /
Int baseweekday; / * This year, the Western Day is 1 * /
INT basekanchih; / * This year, the sanctuary of January 1 is reduced by 1 * /
Int Monthdays [13]; / * This lunar month size, 0 == Xiaoyue (29th), 1 == Dali (30th
) * /
}
Struct taglunarcal lunarcal [] = {
{23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0), / * 1936 * /
{23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0}, / * 1936 * / {41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1},
{30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1),
{49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),
{38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1}, / * 1940 * /
{26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0),
{45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),
{35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),
{24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1}, / * 1944 * /
{43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1),
{32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1),
{21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),
{40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1}, / * 1948 * /
{28, 7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),
{47, 0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1),
{36, 0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),
{26, 5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, / * 1952 * /
{44, 0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1),
{33, 0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0),
{23, 3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1),
{42, 0, 6, 2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1}, / * 1956 * /
{30, 8, 1, 8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),
{48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),
{48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0),
{38, 0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1),
{27, 6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0), / * 1960 * /
{45, 0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0),
{35, 0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1},
{24, 4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0), {43, 0, 2, 44, 1, 0, 1 , 0, 0, 1, 0, 1, 0, 1, 1, 1, 0}, / * 1964 * /
{32, 0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1},
{20, 3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0),
{39, 0, 6, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0),
{29, 7, 0, 5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, / * 1968 * /
{47, 0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),
{36, 0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0),
{26, 5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1),
{45, 0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1}, / * 1972 * /
{33, 0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1),
{22, 4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1),
{41, 0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1),
{30, 8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1}, / * 1976 * /
{48, 0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1),
{37, 0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),
{27, 6, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0),
{46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0), / * 1980 * /
{46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0), / * 1980 * /
{35, 0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1),
{24, 4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1),
{43, 0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1),
{32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1}, / * 1984 * /
{50, 0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),
{39, 0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1},
{28, 6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0),
{47, 0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 1988 * /
{36, 0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0),
{26, 5, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}, {45, 0, 1, 6, 0, 1, 0 , 0, 1, 0, 0, 1, 0, 1, 1, 1, 0),
{34, 0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0}, / * 1992 * /
{22, 3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),
{40, 0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0),
{30, 8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1),
{49, 0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1}, / * 1996 * /
{37, 0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1),
{27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1),
{46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1),
{35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1}, / * 2000 * /
{23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),
{42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),
{42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),
{31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0),
{21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, / * 2004 * /
{39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1),
{28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1),
{48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1),
{37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1}, / * 2008 * /
{25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),
{44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1),
{33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1),
{22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}, / * 2012 * /
{40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0),
{30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1),
{49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1),
{38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0}, / * 2016 * /
{27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1),
{46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0),
{35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0),
{24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1}, / * 2020 * /
{42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0),
{21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1),
{40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 2024 * /
{40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1}, / * 2024 * /
{28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0),
{47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1),
{36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1),
{25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0}, / * 2028 * /
{43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1),
{32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0),
{22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0})
#define lastyear (Firstyear Sizeof (Lunarcal) / Sizeof (Struct
Taglunarcal) -1)
/ * Number of days per month * /
INT Solarcal [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/ * The number of days per month, the number of days and leap years * /
Int SolarDays [2] [14] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397}};
/ * Ask if this west calendar year is a leap year, return 0 is the year, 1 is a leap year * /
Int getleap (int year)
{
IF (Year% 400 == 0)
IF (Year% 400 == 0)
Return 1;
Else IF (Year% 100 == 0)
Return 0;
Else IF (Year% 4 == 0)
Return 1;
Else
Return 0;
}
/ * Survey Lunar Conversion * /
INT Calconv (Struct Convdate * CD)
{
INT LEAP, D, SM, Y, IM, L1, L2, ACC, I, LM, KC;
IF (CD-> Source == 0) / * Solar * /
{
IF (CD-> Solaryear <= firstyear || CD-> Solaryear> Lastyear) Return 1;
SM = CD-> Solarmonth - 1;
IF (SM <0 || SM> 11)
Return 2;
Leap = getleap (CD-> Solaryear);
IF (SM == 1)
IF (SM == 1)
D = leap 28;
Else
D = Solarcal [SM];
IF (CD-> Solardate <1 || CD-> Solardate> D)
Return 3;
Y = CD-> Solaryear - firstyear;
ACC = SolarDays [Leap] [SM] CD-> Solardate;
CD-> weekday = (ACC Lunarcal [Y] .baseweekday)% 7;
Kc = ACC Lunarcal [Y] .Basekanchih;
CD-> kan = kc% 10;
CD-> CHIH = KC% 12;
IF (ACC <= Lunarcal [Y] .BaseDays)
{
Y--
CD-> Lunaryear = CD-> Solaryear - 1;
Leap = Getleap (CD-> Lunaryear);
SM = 12;
ACC = SolarDays [Leap] [SM] CD-> Solardate;
}
Else
CD-> Lunaryear = CD-> Solaryear;
L1 = lunarcal [y] .basedays;
L1 = lunarcal [y] .basedays;
For (i = 0; i <13; i )
{
L2 = L1 Lunarcal [Y] .MONTHDAYS [i] 29;
IF (ACC <= L2)
Break;
L1 = L2;
}
CD-> lunarmonth = i 1;
CD-> Lunardate = ACC - L1;
IM = Lunarcal [Y] .intercalation;
IF (IM! = 0 && CD-> Lunarmonth> IM)
{
CD-> lunarmonth -;
IF (cd-> lunarmonth == iM)
CD-> lunarmonth = -im;
}
IF (CD-> Lunarmonth> 12)
CD-> Lunarmonth - = 12;
}
ELSE / * LUNAR * /
{
IF (CD-> Lunaryear
IF (CD-> Lunaryear
Return 1;
Y = CD-> Lunaryear - firstyear;
IM = Lunarcal [Y] .intercalation;
LM = CD-> Lunarmonth;
IF (lm <0)
{
IF (lm! = -im)
Return 2;
}
ELSE IF (LM <1 || LM> 12)
Return 2;
IF (IM! = 0)
{
IF (lm> IM)
LM ;
ELSE IF (lm == -im)
LM = IM 1;
}
LM -;
IF (CD-> Lunardate> Lunarcal [Y] .MONTHDAYS [LM] 29)
Return 3;
ACC = Lunarcal [Y] .BaseDays;
ACC = Lunarcal [Y] .BaseDays;
For (i = 0; I ACC = Lunarcal [Y] .MONTHDAYS [i] 29;
ACC = CD-> Lunardate;
Leap = Getleap (CD-> Lunaryear);
For (i = 13; i> = 0; I -)
IF (ACC> SolarDays [leap] [i])
Break;
CD-> Solardate = ACC - SolarDays [leap] [i];
IF (i <= 11)
{
CD-> Solaryear = CD-> LunaryEar;
CD-> Solarmonth = i 1;
}
Else
{
CD-> Solaryear = CD-> LunaryEar 1;
CD-> Solarmonth = I - 11;
}
Leap = getleap (CD-> Solaryear);
Y = CD-> Solaryear - firstyear;
ACC = SolarDays [Leap] [CD-> Solarmonth-1] CD-> Solardate;
CD-> weekday = (ACC Lunarcal [Y] .baseweekday)% 7;
Kc = ACC Lunarcal [Y] .Basekanchih;
{
CD-> kan = kc% 10;
CD-> CHIH = KC% 12;
}
Return 0;
}