#include #include int is_leap_year(int year){ if((year - 2000)%400==0) return 1; else if((year - 2000)%100 == 0) return 0; else if((year - 2000)%4 == 0) return 1; else return 0; } int cal_week_day(int year, int month, int day){ const int year2000_start_week_day = 5;//0-base, 2000/1/1 is Saturday int year_start_week_day = 0;//week day of JAN 1st int week_day = 0; int common_year_week_day_offset[12] = {0,3,3,6,1,4,6,2,5,0,3,5}; int leap_year_week_day_offset[12] = {0,3,4,0,2,5,0,3,6,1,4,6}; //find the start week day of the year year_start_week_day = year2000_start_week_day; if(year > 2000){ year_start_week_day += (year - 2000)*365; year_start_week_day += 1;//because 1/1-12/31 is 365 days, the 1/1 of next year is the 366th day. } if(year - 2000 >= 4){ year_start_week_day += (year - 2000) / 4; } if(year - 2000 >= 100){ year_start_week_day -= (year - 2000) / 100; } if(year - 2000 >= 400){ year_start_week_day += (year - 2000) / 400; } year_start_week_day %= 7; //find week day if(is_leap_year(year)){ week_day = (year_start_week_day + leap_year_week_day_offset[month-1] + (day-1))%7; }else{ week_day = (year_start_week_day + common_year_week_day_offset[month-1] + (day-1))%7; } return week_day; } int main(int argc, char* argv[]){ int year = atoi(argv[1]); int month = atoi(argv[2]); int day = atoi(argv[3]); //printf("%d/%d/%d week day(1-7):%d\n",year,month,day,cal_week_day(year,month,day)+1); printf("%d/%d/%d week day(0-6):%d\n",year,month,day,cal_week_day(year,month,day)); }