/ Published in: C++
Brute-force calculation of any date. Includes some very tricky rules for modern-day Gregorian calendar.
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#include <iostream> #include <fstream> #include <string> using namespace std; bool isLeapYear(int year) { bool retval = false; if (year % 100 == 0) { if (year % 400 == 0) { retval = true; } } else if (year % 4 == 0) { retval = true; } return retval; } int daysInMonth(int month, int year) { switch (++month) { case 4: case 6: case 9: case 11: return 30; break; case 2: if (isLeapYear(year)) { return 29; } else return 28; break; default: return 31; break; } } int getFirstDayOfMonth(int month, int year, int day) { int retval = -1; int numdays; if (month == 0) { numdays = daysInMonth(11, year-1); } else { numdays = daysInMonth(month-1, year); } int offset = numdays % 7; if (month == 0 && year == 1900) { retval = 1; } else { retval = (day + offset) % 7; } return retval; } int getThirteenth(int firstday) { return ((13 - firstday) % 7); } int main() { ofstream fout ("friday.out"); ifstream fin ("friday.in"); int numYears; fin >> numYears; int year = 1900; int firstDay[numYears][12]; int numThirteenths[7]; int day; for (int z = 0; z < 7; ++z) numThirteenths[z] = 0; for (int x = 0; x < numYears; ++x) { for (int month = 0; month < 12; month++) { if (year == 1900 && month == 0) { firstDay[x][month] = 1; } else if (month == 0) { firstDay[x][month] = getFirstDayOfMonth(month, year, firstDay[x-1][11]); } else { firstDay[x][month] = getFirstDayOfMonth(month, year, firstDay[x][month-1]); } ++numThirteenths[((firstDay[x][month] + 5) % 7)]; } ++year; } fout << numThirteenths[6] << " "; for (int y = 0; y < 5; ++y) fout << numThirteenths[y] << " "; fout << numThirteenths[5] << endl; return 0; }