I'm using the Calendar API of Java to calculate the total number of sundays which fall on the first day of every month. The Following code gives me 1 extra days for the specified starting date and ending date of date format (Year/Month/Date). 1900/01/01 to 1910/01/01
Input format of the code is :
1<=Testcases<=10
Starting Date
Ending Date
import java.io.*;
import java.util.*;
import java.time.DayOfWeek;
public class ProjectEuler19 {
public static void main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
Scanner scanner = new Scanner(System.in);
int testCases = scanner.nextInt();
do{
int sundays = 0;
Calendar c = Calendar.getInstance();
int monthStart,dateStart,monthEnd,dateEnd;
int yearStart,yearEnd;
yearStart = scanner.nextInt();
monthStart = scanner.nextInt();
dateStart = scanner.nextInt();
yearEnd = scanner.nextInt();
monthEnd = scanner.nextInt();
dateEnd = scanner.nextInt();
String[] getDayOfWeek = new String[]{
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY",
"SATURDAY",
"SUNDAY"
};
for(int y = yearStart; y<=yearEnd; y++) {
for(int m = monthStart; m<=12; m++) {
c.set(y,m-1,1);
if(String.valueOf(getDayOfWeek[c.get(Calendar.DAY_OF_WEEK)-1]).equals(String.valueOf(DayOfWeek.SUNDAY))) {
sundays++;
}
if(m > monthEnd && y == yearEnd)
break;
}
}
System.out.println(sundays);
testCases--;
}while(testCases != 0 && testCases>=1 && testCases<=100);
}
}
And the sample out put is :
2
1900 1 1
1910 1 1
17
2000 1 1
2020 1 1
36
According the calendar the number of sundays between 1900 and 1910 are 18 and the number of sundays between 2000 and 2020 are 35.
You are actually counting the number of Mondays. Calendar.SUNDAY is the first week day constant, and has value 1.
Why not compare c.get(Calendar.DAY_OF_WEEK) with Calendar.SUNDAY directly?
java.timeIn March 2014, Java 8 introduced the modern, java.time date-time API which supplanted the error-prone legacy, java.util date-time API. Any new code should use the java.time API. If you are receiving an instance of java.util.Date, convert it tojava.time.Instant, using Date#toInstant and derive other date-time classes of java.time from it as per your requirement.
LocalDate#getDayOfWeek returns you an enum constant for a given LocalDate. You can use this constant for your comparison.LocalDate#plusMonths(1).Demo:
public class Main {
public static void main(String[] args) {
// Test
System.out.printf(
"The no. of sundays falling on the first day of the month from 1900-01-01 to 1910-01-01: %d%n",
sundaysOnFirstDayOfMonth(LocalDate.of(1900, 1, 1), LocalDate.of(1910, 1, 1)));
System.out.printf(
"The no. of sundays falling on the first day of the month from 2000-01-01 to 2020-01-01: %d%n",
sundaysOnFirstDayOfMonth(LocalDate.of(2000, 1, 1), LocalDate.of(2020, 1, 1)));
}
static int sundaysOnFirstDayOfMonth(LocalDate startDate, LocalDate endDate) {
int counter = 0;
// Move startDate to the 1st day of the next month if its day-of-month is not 1;
// otherwise, keep it as it is
startDate = startDate.getDayOfMonth() > 1 ?
startDate.plusMonths(1).withDayOfMonth(1) :
startDate;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusMonths(1))
if (date.getDayOfWeek() == DayOfWeek.SUNDAY)
counter++;
return counter;
}
}
Output:
The no. of sundays falling on the first day of the month from 1900-01-01 to 1910-01-01: 18
The no. of sundays falling on the first day of the month from 2000-01-01 to 2020-01-01: 35
Online Demo
Assumptions:
startDate, passed to the function, sundaysOnFirstDayOfMonth is not 1, start counting from the next month. If you require to start counting from the month of startDate, irrespective of its day-of-month, replace startDate = startDate.getDayOfMonth() > 1 ? startDate.plusMonths(1).withDayOfMonth(1) : startDate with startDate = startDate.withDayOfMonth(1).endDate is inclusive. If you want to exclude endDate, replace !date.isAfter(endDate) with date.isBefore(endDate).Learn more about the modern Date-Time API from Trail: Date Time.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With