Giới thiệu
Cho hai ngày dưới dạng mảng date1[], date2[] (DD, MM, YYYY). Tính số ngày chênh lệch giữa chúng.
Ví dụ minh họa
Đầu vào
date1[] = {13, 3, 2021}, date2[] = {24, 5, 2023}
Đầu ra
802
Giải thích
Chênh lệch: 2 năm, 2 tháng (3→5), 11 ngày. 2*365 + (30+31) + 11 = 802
Phương pháp hiệu quả: Tính ngày tuyệt đối
Tính tổng số ngày từ 01/01/0000 đến mỗi ngày, lấy hiệu tuyệt đối.
- Năm: 365 * năm + số năm nhuận
- Tháng: Sử dụng mảng tiền tố
monthDays[]lưu ngày tích lũy đầu tháng - Ngày: Cộng thêm ngày của tháng hiện tại
Chương trình minh họa
#include <iostream>
#include <cmath>
using namespace std;
const int monthDays[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
int countLeapYearDays(int d[]) {
int years = d[2];
if (d[1] <= 2) years--;
return (years / 4) - (years / 100) + (years / 400);
}
int countNoOfDays(int date1[], int date2[]) {
long dayCount1 = date1[2] * 365L;
dayCount1 += monthDays[date1[1] - 1];
dayCount1 += date1[0];
dayCount1 += countLeapYearDays(date1);
long dayCount2 = date2[2] * 365L;
dayCount2 += monthDays[date2[1] - 1];
dayCount2 += date2[0];
dayCount2 += countLeapYearDays(date2);
return abs(dayCount1 - dayCount2);
}
int main() {
int date1[3] = {13, 3, 2021};
int date2[3] = {24, 5, 2023};
cout << "The number of days between two dates is " << countNoOfDays(date1, date2);
return 0;
}
Đầu ra
The number of days between two dates is 802
Lưu ý: Mảng monthDays đã được sửa để 0-based indexing (tháng 1 tại index 0).