Public feed
#889248
#include <iostream>
#include <cassert>
using namespace std;
char* month_names[]={"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
const int MINYEAR = 1600;
const int FIRST2MONTHS = 59; // 1600 was a leap year
int toJulian(int day, int month, int year)
{
if(year == MINYEAR && month < 3)
{ if(month == 1) return day-1;
else return day+30;
}
else
{ if(month > 2) month = month - 3;
else
{ month = month + 9;
year = year - 1;
}
year = year - MINYEAR;
return (((year / 100)*146097) / 4) + (((year % 100) * 1461) / 4) +(((153 * month) + 2) / 5) + day + FIRST2MONTHS;
}
}
void fromJulian(int totalDays, int& rd, int& rm, int& ry)
{ int year, month, day;
if(totalDays <= FIRST2MONTHS) // 59
{ year = MINYEAR;
if(totalDays <= 30)
{ month = 1;
day = totalDays + 1;
}
else
{ month = 2;
day = totalDays - 30;
}
}
else
{ int i = (4 * (totalDays - FIRST2MONTHS)) - 1;
int j = (4 * ((i % 146097) / 4)) + 3;
year = (100 * (i / 146097)) + (j / 1461);
i = (5 * (((j % 1461) + 4) / 4)) - 3;
month = i / 153;
day = ((i % 153) + 5) / 5;
if(month < 10) month = month + 3;
else
{ month = month - 9;
year = year + 1;
}
year = year + MINYEAR;
}
rd = day;
rm = month;
ry = year;
}
int main()
{ int i, year, month, day, j;
//cout << "total days = ";
//cin >> i;
for(i = 0; i < 150000; i++)
{ fromJulian(i, day, month, year);
j = toJulian(day, month, year);
assert(i == j);
cout << i << "\t " << month_names[month] << " " << day << ", " << year << endl;
}
return 0;
}