Hướng dẫn giải của Kiểm tra năm nhuận
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Hiểu bài toán
Bài toán yêu cầu kiểm tra một năm year có phải là năm nhuận theo dương lịch hay không. Năm nhuận được xác định theo quy tắc: chia hết cho 400, hoặc chia hết cho 4 nhưng không chia hết cho 100. Ngoài ra, đề bài giới hạn năm hợp lệ nằm trong khoảng (0, 100000]. Nếu năm nhập vào nằm ngoài khoảng này, cần in ra 'INVALID'.
Các cách tiếp cận
Cách Direct Conditional Check
#include <stdio.h>
int main(){
int n;
scanf("%d", &n);
if(n<=0 || n>100000) printf("INVALID");
else{
if(n%400==0||(n%4==0 && n%100!=0)) printf("YES");
else printf("NO");
}
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Phương pháp này thực hiện kiểm tra trực tiếp các điều kiện về năm nhuận và phạm vi hợp lệ trong một khối lệnh if-else. Kiểm tra điều kiện năm nhuận (n%400==0 || (n%4==0 && n%100!=0)) là cách diễn đạt ngắn gọn nhất của quy tắc dương lịch. Đây là cách tiếp cận hiệu quả nhất về cả thời gian và bộ nhớ.
Cách Nested Conditional Check
#include <stdio.h>
int main (){
int year;
scanf ("%d", &year);
if (year > 0 && year <= 100000){
if (year % 400 == 0 ){
printf ("YES");
}
else if (year % 100 != 0 && year % 4 == 0){
printf ("YES");
}
else {
printf ("NO");
}
}
else {
printf ("INVALID");
}
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Phương pháp này tách biệt logic kiểm tra năm nhuận thành các trường hợp lồng nhau: kiểm tra chia hết cho 400 trước, sau đó mới kiểm tra điều kiện chia hết cho 4 và không chia hết cho 100. Về mặt logic và độ phức tạp thời gian, phương pháp này tương đương với phương pháp 1, nhưng cấu trúc code dễ đọc hơn một chút.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(1) | O(1) | Direct Conditional Check |
| 2 | O(1) | O(1) | Nested Conditional Check |
Bài học kinh nghiệm
- Quy tắc năm nhuận không đơn giản là 'chia hết cho 4'. Cần phải loại trừ các năm chia hết cho 100 (trừ trường hợp chia hết cho 400).
- Kiểm tra điều kiện hợp lệ của input (0 < year <= 100000) phải được thực hiện trước khi xử lý logic nghiệp vụ.
Lỗi thường gặp
- Quên kiểm tra giới hạn
0 < year <= 100000và chỉ xử lý logic năm nhuận, dẫn đến sai kết quả cho các input âm hoặc lớn hơn 100000. - Sử dụng sai toán tử logic, ví dụ viết
n%4==0 && n%100!=0 || n%400==0mà không dùng ngoặc đơn có thể gây lỗi ưu tiên toán tử nếu không nhớ quy tắc (trong C thì&&có ưu tiên cao hơn||nên viết không ngoặc vẫn đúng, nhưng dễ gây nhầm lẫn).
Bình luận