算法笔记练习 题解合集
题目
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
思路
和书上思路不太一样,用了比较暴力的解法,假设公元 0 年 1 月 1 日是第 1 天,先算出来两个日期分别是第几天,答案即为两个天数之差的绝对值。
代码
#include <cstdio>
#include <cmath>
const int common[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
const int leap[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int isLeap(int n) {
int yes = 0;
if (!(n % 400))
yes = 1;
else if (!(n % 100))
yes = 0;
else if (!(n % 4))
yes = 1;
else
yes = 0;
return yes;
}
int totalDay(int y, int m, int d) {
int sum = 0;
int i;
for (i = 1; i < y; i++) {
if (isLeap(i))
sum += 366;
else
sum += 365;
}
for (i = 1; i < m; i++) {
if (isLeap(y))
sum += leap[i - 1];
else
sum += common[i - 1];
}
sum += d;
return sum;
}
int main() {
int y1, m1, d1;
int y2, m2, d2;
while (scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
scanf("%4d%2d%2d", &y2, &m2, &d2);
printf("%d\n", (int)(fabs((double)totalDay(y2,m2,d2) - (double)totalDay(y1,m1,d1)) + 1.0));
}
return 0;
}