题意:给定前后日期,判断差距天数等。 思路:模拟 学习点:主要有三点: (1) 调试程序时,重定向的使用 #define LOCAL //提交时删去。 #include <iostream> int main() { //新掌握1 !! #ifdef LOCAL freopen("2846.in", "r", stdin); freopen("2846.out", "w", stdout); #endif .. .. .. } (2)判断闰年 int isLeapYear(int year, int month) { if (month > 2 && (year % 4 == 0) && (year % 100 || year % 400 == 0)) return 1; return 0; } (3)一种字符输出方法,比较好的技巧 (见代码掌握点2) printf("%d DAY%s PRIOR/n", -diff, diff == -1 ? "" : "S"); 源代码: //#define LOCAL #include <iostream> using namespace std; //新掌握3 !! int isLeapYear(int year, int month); int nMonthDay[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int main() { //新掌握1 !! #ifdef LOCAL freopen("2846.in", "r", stdin); freopen("2846.out", "w", stdout); #endif int nCase, nCaseNum = 0;; int M, D, Y, m, d, y; int day1, day2, diff; for (int i = 1; i <= 12; i ++) { nMonthDay[i] += nMonthDay[i-1]; } scanf("%d", &nCase); while (nCase --) { scanf("%d/%d/%d %d/%d", &M, &D, &Y, &m, &d); if (M == m || M + 1 == m || M - 1 == m) { y = Y; day1 = nMonthDay[M-1] + D + isLeapYear(Y, M); day2 = nMonthDay[m-1] + d + isLeapYear(y, m); diff = day2 - day1; } else if (M == 12 && m == 1) { y = Y + 1; diff = d + (31 - D); } else if (M == 1 && m == 12) { y = Y - 1; diff = -(D + 31 - d); } else { printf("%d OUT OF RANGE/n", ++nCaseNum); continue; } if (diff == 0) { printf("%d SAME DAY/n", ++nCaseNum); } else if (diff < -7 || diff > 7) { printf("%d OUT OF RANGE/n", ++nCaseNum); } else { printf("%d %d/%d/%d IS ", ++nCaseNum, m, d, y); if (diff < 0) {//新掌握2 !! printf("%d DAY%s PRIOR/n", -diff, diff == -1 ? "" : "S"); } else { printf("%d DAY%s AFTER/n", diff, diff == 1 ? "" : "S"); } } } return 0; } int isLeapYear(int year, int month) { if (month > 2 && (year % 4 == 0) && (year % 100 || year % 400 == 0)) return 1; return 0; }