Yin Yang calendar algorithm
/ * Simon Ming Ming, Lunar Circuit, Huang Xiaoming, 1995, 7, 25 Prototype: Int Calconv (struct convdate *); struct convdate {int source; == 0 Enter the date is a Vehicle,! = 0 Enter is a lunar calendar Int Solaryear; output or input Volume Int Solarmonth; Wircondu Moon Int Solardate; Wircondu Int LunaryEar; Output or Enter Lunar New Year Int Lunarmonth; Lunar Int Lunardate; Lunar Day Int Weekday; This day is the day of the week (0 == Sunday, 1 == Week First, ...) int KAN; this day dry (0 == A, 1 == B, ..., 9 ==) Int chih; this day, the day, the day, 1 == ugly,. .., 11 == Hai)}; When the call is required, if 0 is a recorded calendar, otherwise it will turn to the Victorian calendar. Then the input as the contraman or the lunar calendar. Day. The annual month after the conversion will be filled in the structure (lunar calendar or the West calendar), as well as the day of the week, and the dry land. If the function of the return value is 0, there is no error, 1 is an incorrect error, 2 is Enter the month error, 3 is an incorrect error. In the Western calendar year, the Lunar calendar must be expanded between 1937 - 2031, and increase the lunarcal [] * / #define firstnessEar 1936 / * THE first year in lunarcal [] * / struct convdate {int source; int solaryear; int solarmonth; int solardate; int lunaryear; int lunarmonth; int lunardate; int weekday; int kan; int chih;}; struct taglunarcal {int basedays; / * Cumulative daily number of days to the first month of January 1, January 1, the first month of the Lunar New Year * / INTERCALATION; / * 月 月 份. 0 == There is no leapies in this year * / int baseweekday; / * This year, the Western, the week is a few days. 1 * / int basekanchih; / * This year, the western day, the stem number of the dry branch is reduced by 1 * / int MONTHDAYS [13]; / * This product is the size of the month, 0 == Xiaoyue (29th), 1 == Day Month (30 days ) * /}; struct taglunarcal lunarcal [] =
{{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, 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), {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 * / {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, 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}, {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 * / {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}, {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 (Lunarcal) / Sizeof (Struct Taglunarcal) / * The number of days of the Wemon New Year * / Int Solarcal [12] = {31, 28, 31, 30, 31, 30, 31, 31 , 30, 31, 30, 31}; / * Monthly Cumulative Daily Number of Vehicles, Department of Halo 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}}; / * Whether the Word Year is a leap year, returning 0 is a year, 1 is a leap year * / int getleap (int year) {if (Year% 400 == 0) Return 1; Else IF (Year% 100 == 0) Return 0; Else IF (Year% 4 == 0) RETURN 1; ELSE Return 0;} / * Simple 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 <= first "|| CD-> Solaryear> Lastyear) Return 1; SM = CD-> Solarmonth - 1; IF ( SM <0 || SM> 11) Return 2; Leap = Getleap (CD-> Solaryear); 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; 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-> Lunar MONTH == IM) CD-> lunarmonth = -im;} if (cd-> lunarmonth> 12) CD-> lunarmonth - = 12;} else / * lunar * / {i (cd-> lunaryear