题解 | 日期差值

日期差值

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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务