题目链接:http://codeforces.com/problemset/problem/304/B
题目意思:给出两个日期,需要算出这两个日期之间有多少日。
细心模拟就可以了。特别要注意的是,两个日期是同一年的处理。我的解决方法是,算出小的那一个日期的天数离它所处月份还有多少天,大的日期的天数加上去,还有一部分是它们之间相隔的月数总天数。另外,为了方便处理,保证了第一个处理的日期是较小的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 7 static char dd[2][13] = { 8 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 9 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 10 }; 11 12 int jd_year(int year) 13 { 14 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 15 return 1; 16 return 0; 17 } 18 19 int day_of_year(int year, int month, int day) // 算出该日期在该year年处于第几天 20 { 21 for (int i = 1; i < month; i++) 22 day += dd[jd_year(year)][i]; 23 return day; 24 } 25 26 int main() 27 { 28 int y, m, d, y1, m1, d1, i, cnt; 29 scanf("%d:%d:%d", &y, &m, &d); 30 scanf("%d:%d:%d", &y1, &m1, &d1); 31 if (y > y1 || (y == y1 && m > m1) || (y == y1 && m == m1 && d > d1)) 32 { 33 swap(y, y1); 34 swap(m, m1); 35 swap(d, d1); 36 } 37 if (y == y1) 38 { 39 if (m != m1) 40 { 41 cnt = dd[jd_year(y)][m]-d + d1; 42 for (i = m+1; i < m1; i++) 43 cnt += dd[jd_year(y)][i]; 44 } 45 else 46 cnt = d1 - d; 47 } 48 else 49 { 50 cnt = day_of_year(y, m, d); 51 if (jd_year(y)) 52 cnt = 366 - cnt; 53 else 54 cnt = 365 - cnt; 55 cnt += day_of_year(y1, m1, d1); 56 for (i = y+1; i < y1; i++) 57 { 58 if (jd_year(i)) 59 cnt += 366; 60 else 61 cnt += 365; 62 } 63 } 64 printf("%d\n", cnt); 65 return 0; 66 } 67 68