89 lines
2.3 KiB
C
Raw Normal View History

#include <stdio.h>
#include "utils.h"
/*
You are given the following information, but you may prefer to do some research for yourself.
1 Jan 1900 was a Monday.
Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?
https://projecteuler.net/problem=19
*/
enum Month {JANUARY=1,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER};
int DaysInMonth(enum Month month,int year) {
switch (month) {
case JANUARY:
case MARCH:
case MAY:
case JULY:
case AUGUST:
case OCTOBER:
case DECEMBER:{
return 31;
}break;
case APRIL:
case JUNE:
case SEPTEMBER:
case NOVEMBER:{
return 30;
}break;
case FEBRUARY:{
return ((year%100==0)&&(year%400!=0))?28:(year%4==0)?29:28;
}break;
}
}
int main(int argc,char**argv) {
int day=1;
enum Month month=1;
int year=1900;
enum Weekday{
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
} weekday=MONDAY;
int sundayCount=0;
while((day!=31)||(month!=12)||(year!=2000)) {
printf("Date: %d/%d/%d\n",month,day,year);
if (year>=1901) {
//Start counting Sundays.
if (weekday==SUNDAY&&day==1) {
sundayCount++;
}
}
//Increment the day.
if (day+1<=DaysInMonth(month,year)) {
day++;
} else
if (month+1<=12){
//It's a new month.
month++;
day=1;
} else {
//It's a new year!
year++;
day=1;
month=1;
//printf("The year is now %d...\n",year);
}
weekday=((weekday+1)<=SATURDAY)?weekday+1:SUNDAY;
}
printf("\n\n%d Sundays were on the 1st of the month.",sundayCount);
return 0;
}