#include #include 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; }