Public feed #889248

Mine

public text v1 · immutable
Raw Edit
·published 2008-02-02 20:10 UTC
rendered paste body
#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;
}