Giới thiệu
Cho ngày, tháng, năm dưới dạng số nguyên. Nhiệm vụ là xác định xem ngày tháng năm này có hợp lệ hay không.
Ngày hợp lệ phải nằm trong khoảng từ 01/01/1800 đến 31/12/9999. Các ngày ngoài phạm vi này được coi là không hợp lệ.
Kiểm tra không chỉ dựa trên phạm vi năm mà còn phải tuân thủ tất cả các ràng buộc của lịch:
- Ngày không được nhỏ hơn 1 và lớn hơn 31
- Tháng không được nhỏ hơn 1 và lớn hơn 12
- Năm không được nhỏ hơn 1800 và lớn hơn 9999
- Các tháng 4, 6, 9, 11 không được có ngày lớn hơn 30
- Tháng 2 cần kiểm tra năm nhuận:
- Nếu là năm nhuận thì ngày không quá 29
- Ngược lại ngày không quá 28
Nếu thỏa mãn tất cả ràng buộc thì ngày hợp lệ, ngược lại thì không.
Ví dụ
Input: y = 2002, d = 29, m = 11 → Output: Date is valid Input: y = 2001, d = 29, m = 2 → Output: Date is not valid
Thuật toán
Hàm isleap(int y):
Nếu (y % 4 == 0) && (y % 100 != 0) && (y % 400 == 0) thì trả về 1
Ngược lại trả về 0
Hàm datevalid(int d, int m, int y):
Nếu y < 1800 hoặc y > 9999 → trả về 0
Nếu m < 1 hoặc m > 12 → trả về 0
Nếu d < 1 hoặc d > 31 → trả về 0
Nếu m == 2:
Nếu isleap(y) thì:
Nếu d <= 29 → trả về 1, ngược lại trả về 0
Nếu m ∈ {4,6,9,11}:
Nếu d <= 30 → trả về 1, ngược lại trả về 0
Trả về 1
Hàm main:
Khởi tạo y=2002, d=29, m=11
Nếu datevalid(d,m,y) thì in "Date is valid"
Ngược lại in "date is not valid"
Code C
#include <stdio.h>
#define MAX_YR 9999
#define MIN_YR 1800
// Kiểm tra năm nhuận
int isleap(int y) {
if ((y % 4 == 0) && (y % 100 != 0) && (y % 400 == 0))
return 1;
else
return 0;
}
// Kiểm tra ngày hợp lệ
int datevalid(int d, int m, int y) {
if (y < MIN_YR || y > MAX_YR) return 0;
if (m < 1 || m > 12) return 0;
if (d < 1 || d > 31) return 0;
// Kiểm tra theo tháng
if (m == 2) {
if (isleap(y)) {
if (d <= 29) return 1;
else return 0;
}
}
// Các tháng 30 ngày
if (m == 4 || m == 6 || m == 9 || m == 11)
if (d <= 30) return 1;
else return 0;
return 1;
}
int main() {
int y = 2002, d = 29, m = 11;
if (datevalid(d, m, y))
printf("Date is valid\n");
else
printf("date is not valid\n");
return 0;
}
Kết quả
Date is valid