DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Roger has posted 34 posts at DZone. View Full User Profile

Calendar Calculation In C++

11.04.2008
| 12035 views |
  • submit to reddit
        // Coded for USACO's "friday" algorithm puzzle. Allows the user to brute-force calculate any date 
// using the modern-day Gregorian calendar.

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