1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int Moon_phase(int year,int month,int day)
{
/*k
Calculates the moon phase (0-7), accurate to 1 segment.
0 = > new moon.
4 => Full moon.
*/
int g, e;
if (month == 1) --day;
else if (month == 2) day += 30;
else // m >= 3
{
day += 28 + (month-2)*3059/100;
// adjust for leap years
if (!(year & 3)) ++day;
if ((year%100) == 0) --day;
}
g = (year-1900)%19 + 1;
e = (11*g + 18) % 30;
if ((e == 25 && g > 11) || e == 24) e++;
return ((((e + day)*6+11)%177)/22 & 7);
}