/* 输入年月日,输出这天星期几 样例输入: 2007 5 1 2006 17 9 2007 6 24 样例输出: 2 3 0 (提示:2006 17 9就是2007年5月9日,要考虑日期进退位,除年份为正整数外,允许输入负数,三个数的绝对值均小于10000) 难度:very easy */ #include <cstdio> int main() { int year = 0; // 年份 int month = 0; // 月份 int date = 0; // 天 int totalDays = 0; // 从 0 年到 当前年份 的总天数 // 平年和闰年的每月天数 int dayOfMonth[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int isLeapYear; // 是否为闰年 int leapYearCount; // 从 0 年到 当前年份前 之间的闰年数 int i; // 循环用变量 while( scanf("%d%d%d", &year, &month, &date) != EOF ) { // 处理月份的进退位 year += month / 12; month %= 12; if( month <= 0 ) { year--; month += 12; } // 算出当前年份之前的总天数:所有年份按平年算 再加上 闰年多出来的天数 leapYearCount = (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400; totalDays = (year - 1) * 365 + leapYearCount; // 根据当前年份是否为闰年, 将当前年份的总天数累加进总天数 isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); for( i = 1; i < month; i++ ) totalDays += dayOfMonth[isLeapYear][i]; totalDays += date; // 模 7 得出星期几 printf("%d/n", totalDays % 7); } return 0; }