Monday, January 14, 2013

UVa 602 - What Day Is It?

Accepted date: 2013-01-12
Ranking (as of 2013-01-14): 191
Language: C++

/*
  UVa 602 - What Day Is It?

  To build using Visual Studio 2008:
    cl -EHsc -O2 UVa_602_What_Day_Is_It.cpp
*/

#include <iostream>
using namespace std;

const char* month_names[] = {
  "January", "February", "March", "April", "May", "June",
  "July", "August","September", "October", "November", "December"
};
const char* weekday_names[] = {"Saturday", "Sunday", "Monday", "Tuesday",
  "Wednesday", "Thursday", "Friday"};
const int month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool is_leap_year(int year)
{
  if (year <= 1752)
    return !(year % 4);
  else {
    if (!(year % 400))
      return true;
    else if (!(year % 100))
      return false;
    else
      return (!(year % 4));
  }
}

bool is_valid_date(int year, int month, int day)
{
  if (year == 1752 && month == 9 && day >= 3 && day <= 13)
    return false;
  if (month > 12)
    return false;
  int d = month_days[month - 1];
  if (month == 2 && is_leap_year(year))
    d++;
  return (day <= d) ? true : false;
}

const char* day_of_week(int year, int month, int day)
{
/*
  Zeller's congruence is used to calculate the day of the week.
*/
  bool gregorian = true;
    // true for Gregorian calender, false for Julian calender
  if (year < 1752)
    gregorian = false;
  else if (year == 1752) {
    if (month < 9)
      gregorian = false;
    else if (month == 9) {
      if (day < 14)
        gregorian = false;
    }
  }
  int q = day;
  if (month < 3) {
    year--; month += 12;
  }
  int m = month, k = year % 100, j = year / 100;
  int h = q + 13 * (m + 1) / 5 + k + k / 4;
  if (gregorian)
    h += j / 4 + 5 * j;
  else
    h += 5 + 6 * j;
  return weekday_names[h % 7];
}

int main()
{
  while (true) {
    int month, day, year;
    cin >> month >> day >> year;
    if (!month && !day && !year)
      break;
    if (is_valid_date(year, month, day))
      cout << month_names[month - 1] << ' ' << day << ", " << year << " is a " <<
        day_of_week(year, month, day) << endl;
    else
      cout << month << '/' << day << '/' << year << " is an invalid date.\n";
  }
  return 0;
}

No comments:

Post a Comment