题解 | 日期差值
日期差值
https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c
按月算或按天算,一直加到第二个日期
按月统计:
#include <iostream>
using namespace std;
int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool is_run(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
// 返回y年m月有多少天
int get_days(int y, int m) {
if (m == 2)
return is_run(y) ? 29 : 28;
return days[m];
}
int main() {
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
int y1 = a / 1e4, m1 = (a % 10000) / 100, d1 = a % 100;
int y2 = b / 1e4, m2 = (b % 10000) / 100, d2 = b % 100;
// 以月为跨度
int d = d2 - d1 + 1; // 需要单独处理开头和结尾两个月
while (!(y1 == y2 && m1 == m2)) {
d += get_days(y1, m1);
m1++;
// 满12月进入下一年
if (m1 > 12) {
y1++;
m1 = 1;
}
}
cout << d << endl;
return 0;
}
按天统计:
#include <iostream>
using namespace std;
int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool is_run(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
// 返回y年m月有多少天
int get_days(int y, int m) {
if (m == 2)
return is_run(y) ? 29 : 28;
return days[m];
}
int main() {
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
int y = a / 1e4, m = (a % 10000) / 100, d = a % 100;
int y2 = b / 1e4, m2 = (b % 10000) / 100, d2 = b % 100;
// 以天为跨度
int cnt = 1; // 包含第一天
while (!(y == y2 && m == m2 && d == d2)) {
d++;
cnt++;
// 满一个月
if (d > get_days(y, m)) {
d = 1;
m++;
// 满一年
if (m > 12) {
y++;
m = 1;
}
}
}
cout << cnt << endl;
return 0;
}
