# APCalendar Solution

The first free response question on the 2019 AP exam has you working with an arbitrary class for working with dates called APCalendar.

For this we’re going to be implementing two methods, numbeOfLeapYears and dayOfWeek.

There are also three helper methods called firstDayOfYear , dayOfYear and isLeapYear. Since they’re giving you helper methods, it’s almost guaranteed that you’ll be calling them somewhere from your solution. And, in fact the explanations for the two methods you’re implementing note that calling these helpers is required.

## numberOfLeapYears

For Part A we’re counting the number of leap years between year1 and year2 , inclusive. And we’re going to use the isLeapYear helper method to make it easier. isLeapYear returns true if a year is a leap year and false if not.

public static int numberOfLeapYears(int year1, int year2) {
int cnt = 0;
for (int y=year1; y<=year2; y++) {
if (isLeapYear(y))
cnt++;
}
return cnt;
}

What I’m doing is creating a counter variable to hold the number of leap years.

Then, a for loop takes the code through all the years from year1 to year2 inclusive (note the y<=year2). The isLeapYear method is called on each year, and if it’s a leap year the code increments cnt.

cnt is returned at the end as the count of leap years.

## dayOfWeek

Part B asks us to implement a method that calculates what day of the week any given date falls on.

To help we have two helper methods.

firstDayOfYear returns an integer that represents what day of the week a specific date is. Sunday is represented by 0, Monday by 1, and so on through Saturday which is represented by 6.

dayOfYear tells us what day a date falls on. For example, dayOfYear( 1, 5, 2019) would return 5 because Jan 5th is the fifth day of the year in 2019.

public static int dayOfWeek(int month, int day, int year) {
int firstDay = firstDayOfYear(year);
int doy = dayOfYear(month, day, year);
return (firstDay + dayOfYear - 1) % 7;
}

I’m storing both the first day of the year and the day of the year in variables firstDay and doy .

Adding those two values together, and subtracting one because dayOfWeek should return based on a 0-indexed array instead of the 1-based list of days, gives us the right day of the week. The %7 at the end takes care of keeping the value within the bounds of the day of week index.