问题描述
链接:https://www.nowcoder.com/questionTerminal/ccb7383c76fc48d2bbc27a2a6319631c
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
示例1
输入
20110412
20110422
输出
11
思路
推荐思路(乾哥的思路):
软男说算法能过就行, 尽可能把实现的方法想简单些(emmmm)
- 计算第一个日期中月份和日到一月一日的天数, 记为days1
- 计算第一个日期中月份和日到一月一日的天数, 记为days2
- 只计算两个日期的年份对应的日期差值
大辣鸡思路(me):- 计算年之间差值
- 计算月之间差值
- 计算日之间差值
代码
#include <cstdio>int month[13][2] = {//平年,闰年0, 0,31, 31,//一月28, 29,//二月31, 31,//三月30, 30,//四月31, 31,//五月30, 30,//六月31, 31,//七月31, 31,//八月30, 30,//九月31, 31,//十月30, 30,//十一月31, 31 //十二月
};int isLeap(int year) {/** 求平年闰年* 平年返回0* 闰年返回1*/if (year % 100 != 0 && year % 4 == 0 || year % 400 == 0) {return 1;} else {return 0;}
}int main() {int y1 = 0, m1 = 0, d1 = 0, y2 = 0, m2 = 0, d2 = 0;while (scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {scanf("%4d%2d%2d", &y2, &m2, &d2);//平年365天//闰年366天int days1 = 0;//日期一, 月及日到当年一月一日的天数int days2 = 0;//日期二, 月及日到当年一月一日的天数int days = 0; //最后返回两日期的差值for (int i = 1; i < m1; ++i) {/** 求日期一, 月到当年一月一日的天数*/days1 += month[i][isLeap(y1)];}for (int i = 1; i < m2; ++i) {/** 求日期二, 月到当年一月一日的天数*/days2 += month[i][isLeap(y2)];}//求日期一,日期二, 日到当月一日的天数days1 += d1;days2 += d2;//求两日期年份差值if (y1 > y2) {for (; y2 < y1; y2++) {if (isLeap(y2) == 1) {days += 366;} else {days += 365;}}days += days1 - days2;} else {for (; y1 < y2; y1++) {if (isLeap(y1) == 1) {days += 366;} else {days += 365;}}days += days2 - days1;}//按照题目叙述,需要返回差值加一printf("%d\n", days + 1);}
}