问题描述
链接: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
", days + 1);
}
}