Archive

Archive for the ‘C/C++’ Category

Calculate week-day names for future date

March 24th, 2010 NamPham No comments

This is very very old problem I encountered when I was in high school. It is good to bring it back :)

Given current date with the week-day name i.e. 03/24/2010 Wednesday. Calculate the week-day names for future date ?

For example: what is the week-day name for 01/01/3999 ? (The answer is Friday)

The idea is simple: just calculate the number of days between two dates.
The small problem is how to come up with a clean algorithm to solve both case: same year or different years.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#include <iostream>
using namespace std;
 
bool isLeapYear(int year){
	return (year % 4 == 0 && year%100 != 0 || year%400 == 0);
}
int main(){
	int cDay = 24,cMonth = 3,cYear = 2010,cWeekDay = 4-2;
	int fDay = 1,fMonth = 1,fYear = 2011,fWeekDay = 0;
	int months[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	char* weekDays[] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
	int cLeft = 0, fLeft = 0, totalDays = 0;
 
	//calculate the days left for current
	if (isLeapYear(cYear)) months[1] = 29;
	else months[1] = 28;
	cLeft = -cDay;
	for (int i = cMonth;i <= 11;i++)
		cLeft += months[i-1];
 
	//calculate the days left for future
	if (isLeapYear(fYear)) months[1] = 29;
	else months[1] = 28;
	fLeft = -fDay;
	for (int i = fMonth;i <= 11; i++)
		fLeft += months[i-1];
 
	//calculate the days between two years
	for (int year = cYear+1;year <= fYear;year ++) // <= fYear is important key !!!
		if (isLeapYear(year))
			totalDays += 366;
		else totalDays += 365;
 
	totalDays += cLeft - fLeft; // final formular
 
	fWeekDay = (cWeekDay + totalDays) % 7;
 
	cout << "Future WeekDay is " << weekDays[fWeekDay] << endl;
 
	system("pause");	
	return 0;
}
Categories: Algorithms, C/C++ Tags: