题目:http://codeup.cn/problem.php?id=1928
1928: 日期差值
时间限制: 1 Sec 内存限制: 32 MB提交: 7900 解决: 1789
[提交][状态][讨论版][命题人:外部导入]
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
结题思路:来自胡凡的《算法笔记》
1 #include <stdio.h> 2 3 //判断是否为闰年 4 int isLeap(int year) 5 { 6 return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); 7 } 8 9 int main() 10 { 11 int monthes[13][2] = { { 0, 0 }, { 31, 31 }, { 28, 29 }, { 31, 31 }, { 30, 30 }, { 31, 31 }, 12 { 30, 30 }, { 31, 31 }, { 31, 31 }, { 30, 30 }, { 31, 31 }, { 30, 30 }, { 31, 31 } }; 13 14 int date1, date2; 15 while (scanf("%d %d", &date1, &date2) != EOF) 16 { 17 int temp; 18 if (date1 > date2){ 19 temp = date1; 20 date1 = date2; 21 date2 = temp; 22 } 23 24 int year1 = date1 / 10000, month1 = date1 / 100 % 100, day1 = date1 % 100; 25 int year2 = date2 / 10000, month2 = date2 / 100 % 100, day2 = date2 % 100; 26 27 int time = 1; 28 29 30 //将年份差距先缩小到1年,这里加365或366的时候要考虑月份是在二月之前还是之后,这决定了用加一之后的年份判断平闰还是用加一之前的年份判断平闰 31 if (month1 == 1 || (month1 == 2 && day1 <= 28)) 32 { 33 while (year2 - year1 > 1) { 34 time += 365 + isLeap(year1); //先判断是否为闰年,然后年份再加一 35 year1++; 36 } 37 38 } 39 40 else 41 { 42 while (year2 - year1 > 1) { 43 year1++; 44 time += 365 + isLeap(year1); //先年份再加一,然后判断是否为闰年 45 46 } 47 } 48 49 int flag = isLeap(year1); 50 while (year1 < year2 || month1 < month2 || day1 < day2) 51 { 52 day1++; 53 54 if (day1 == monthes[month1][flag + 0] + 1) //如果满了当月的天数,就加一个月,日数变成1 55 { 56 month1++; 57 day1 = 1; 58 } 59 60 if (month1 == 13) //如果月份满了12就年份加一,更新闰年标记,月份变成1 61 { 62 year1++; 63 flag = isLeap(year1); 64 month1 = 1; 65 } 66 time++; 67 } 68 printf("%d ", time); 69 } 70 71 return 0; 72 73 }