Ranking (as of 2015-11-11): 2 out of 452
Language: C++
/*
UVa 150 - Double Time
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_150_Double_Time.cpp
*/
#include <cstdio>
#include <cstring>
const int nr_chars_max = 15, nr_days_of_week = 7, nr_months = 12;
const char* day_names[nr_days_of_week] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};
const char* month_names[nr_months] = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
int nr_days[2][nr_months] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} // leap year
};
int nr_days_of_year[2][nr_months] = {
{31, 59, 90,120,151,181,212,243,273,304,334,365},
{31, 60, 91,121,152,182,213,244,274,305,335,366} // leap year
};
const int start_year = 1582, start_day_of_week = 5 /* Friday */,
julian_calendar_start_days = 273 + 5 /* 5 October */,
gregorian_calendar_start_days = 273 + 15 /* 15 October */;
int get_day_of_week(const char* day)
{
for (int i = 0; i < nr_days_of_week; i++)
if (!strcmp(day, day_names[i]))
return i;
return -1;
}
int get_month(const char* month)
{
for (int i = 0; i < nr_months; i++)
if (!strcmp(month, month_names[i]))
return i;
return -1;
}
bool julian_calendar_leap_year(int year)
{
return !(year % 4);
}
int julian_calendar_number_of_leap_years(int syear, int eyear)
{
// number of leap years between [syear, eyear)
syear--; eyear--;
return eyear / 4 - syear / 4;
}
int julian_calendar_number_of_days(int year, int month, int day)
{
int nr_days = (year - start_year) * 365 +
julian_calendar_number_of_leap_years(start_year, year) -
julian_calendar_start_days;
int leap_year = julian_calendar_leap_year(year) ? 1 : 0;
if (month)
nr_days += nr_days_of_year[leap_year][month - 1];
nr_days += day;
return nr_days;
}
bool gregorian_calendar_leap_year(int year)
{
if (!(year % 400))
return true;
else if (!(year % 100))
return false;
else if (!(year % 4))
return true;
else
return false;
}
int gregorian_calendar_number_of_leap_years(int syear, int eyear)
{
// return the number of leap years between [syear, eyear)
syear--; eyear--;
return (eyear / 4 - eyear / 100 + eyear / 400) -
(syear / 4 - syear / 100 + syear / 400);
}
int gregorian_calendar_number_of_days(int year, int month, int day)
{
int nr_days = (year - start_year) * 365 +
gregorian_calendar_number_of_leap_years(start_year, year) -
gregorian_calendar_start_days;
int leap_year = gregorian_calendar_leap_year(year) ? 1 : 0;
if (month)
nr_days += nr_days_of_year[leap_year][month - 1];
nr_days += day;
return nr_days;
}
int main()
{
while (true) {
int day_of_week, day, month, year, leap_year, j_days, g_days;
char day_name[nr_chars_max + 1], month_name[nr_chars_max + 1];
scanf("%s", day_name);
if (day_name[0] == '#')
break;
scanf("%d %s %d", &day, month_name, &year);
day_of_week = get_day_of_week(day_name), month = get_month(month_name);
j_days = julian_calendar_number_of_days(year, month, day);
if ((start_day_of_week + j_days) % nr_days_of_week == day_of_week) {
// julian calendar
g_days = j_days + gregorian_calendar_start_days;
for (year = start_year; ; year++) {
leap_year = gregorian_calendar_leap_year(year) ? 1 : 0;
if (g_days <= nr_days_of_year[leap_year][nr_months - 1])
break;
g_days -= nr_days_of_year[leap_year][nr_months - 1];
}
for (month = 0; ; month++) {
if (g_days <= nr_days[leap_year][month])
break;
g_days -= nr_days[leap_year][month];
}
printf("%s %d %s %d\n", day_name, g_days, month_names[month], year);
}
else { // gregorian calendar
g_days = gregorian_calendar_number_of_days(year, month, day);
j_days = g_days + julian_calendar_start_days;
for (year = start_year; ; year++) {
leap_year = julian_calendar_leap_year(year) ? 1 : 0;
if (j_days <= nr_days_of_year[leap_year][nr_months - 1])
break;
j_days -= nr_days_of_year[leap_year][nr_months - 1];
}
for (month = 0; ; month++) {
if (j_days <= nr_days[leap_year][month])
break;
j_days -= nr_days[leap_year][month];
}
printf("%s %d* %s %d\n", day_name, j_days, month_names[month], year);
}
}
return 0;
}
No comments:
Post a Comment