Calculate week-day names for future date
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++