Để kiểm tra xem một năm có phải là năm nhuận hay không, bạn có thể sử dụng một thuật toán đơn giản dựa trên các quy tắc được nêu ở dưới đây.
Năm nhuận là gì?
Để cài đặt thuật toán kiểm tra năm nhuận, bạn cần hiểu năm nhuận là gì?
Năm nhuận là một năm có một số ngày bổ sung so với năm thông thường (non-leap year). Nói cách khác, trong một năm nhuận, thay vì có 365 ngày như năm thông thường, thì năm đó sẽ có 366 ngày. Ngày bổ sung này được gọi là “ngày nhuận.”
Nguyên tắc để xác định một năm có phải là năm nhuận hay không là dựa trên một quy tắc:
- Năm chia hết cho 4 là năm nhuận (ví dụ: 2004, 2008, 2012, 2016).
- Tuy nhiên, các năm chia hết cho 100 không phải lúc nào cũng là năm nhuận (ví dụ: 1900, 2100) trừ khi năm đó cũng chia hết cho 400 (ví dụ: 2000).
Ví dụ:
- Năm 2004 là năm nhuận vì chia hết cho 4 và không chia hết cho 100.
- Năm 1900 không là năm nhuận vì chia hết cho 100 nhưng không chia hết cho 400.
- Năm 2000 là năm nhuận vì chia hết cho 400.
Mục đích của việc có các năm nhuận là để đảm bảo rằng lịch (calendar) vẫn đồng bộ với mùa và vòng quỹ đạo của Trái Đất. Bằng cách thêm một ngày vào lịch mỗi bốn năm, chúng ta cải thiện tính chính xác của lịch để phù hợp với vòng quỹ đạo của Trái Đất.
Thuật toán kiểm tra năm nhuận
Để kiểm tra 1 năm có phải năm nhuận hay không, chúng ta chỉ cần tuân theo 1 trong 2 nguyên tắc sau đây.
- Năm nhuận là năm chia hết cho 400
- Năm nhuận là năm chia hết cho 4 nhưng không chia hết cho 100
Nếu là lần đầu chắc bạn sẽ thắc mà nguyên tắc thứ 2. Vì bạn được nghe thường xuyên: “Cứ 4 năm lại có 1 năm nhuận”. Tuy nhiên, điều đó không đúng. Lý do:
Trái đất của chúng ta cần 365.25 ngày để quay hết một vòng quanh mặt trời. Phần dư 0.25 thực ra đã làm tròn, con số thực tế là 365.2425 ngày để trái đất quay được một vòng. Giá trị sai số này 0.0075 ngày(0.25 -0.2425) khi nhân với 400 chúng ta sẽ có thêm 3 ngày nữa. Do đó, để lịch của ta chính xác, các chu kỳ 100, 200 và 300 chỉ có 24 năm nhuận thay vì 25. Riêng chu kỳ thứ 400 sẽ có 25 năm nhuận. Điều đó đảm bảo rằng chu kỳ 400 năm sẽ có 97(24+24+24+25) năm nhuận. Như vậy, cứ 400 năm chúng ta sẽ có 97 năm nhuận, không phải 100 nhé.
Khi đó: các năm 400, 404, 408, 800, 896, 1200, 1600, 2000, 2004 là các năm nhuận, trong khi 500, 600, 700.. 1100, 2100 không phải năm nhuận, do chúng chia hết cho cả 4 và 100.
Code kiểm tra năm nhuận
Sau đây mình sẽ cùng các bạn đi cài đặt thuật toán kiểm tra năm nhuận trên các ngôn ngữ lập trình khác nhau.
Kiểm tra năm nhuận trong C/C++
#include <stdio.h> #include <stdbool.h> bool checkYear(int year) { // Nếu số năm chia hết cho 400, // đó là 1 năm nhuận if (year % 400 == 0) return true; // Nếu số năm chia hết cho 4 và không chia hết cho 100, // đó không là 1 năm nhuận if (year % 4 == 0 && year % 100 != 0) return true; // trường hợp còn lại // không phải năm nhuận return false; } int main() { int year = 2000; if(checkYear(year) == true){ printf("%d la nam nhuan!", year): }else{ printf("%d khong phai nam nhuan!", year): } return 0; }
Bạn có thể viết ngắn gọn hàm kiểm tra năm nhuận trên 1 dòng duy nhất như sau:
#include <stdio.h> #include <stdbool.h> bool checkYear(int year) { // Trả về true nếu // chia hết cho 4 nhưng không chia hết cho 100 // hoặc chia hết cho 400 return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)); } int main() { int year = 2000; if(checkYear(year) == true){ printf("%d la nam nhuan!", year); }else{ printf("%d khong phai nam nhuan!", year); } return 0; }
Kết quả chạy:
2000 la nam nhuan!
Kiểm tra năm nhuận code java
class Main { static boolean checkYear(int year) { return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)); } // Driver method public static void main(String[] args) { int year = 2000; System.out.println(checkYear(2000)? "Leap Year" : "Not a Leap Year" ); } }
Code tìm năm nhuận với C#
Bạn chỉ cần sử dụng hàm có sẵn DateTime.IsLeapYear():
if (DateTime.IsLeapYear(year)) { //do stuff }
Cài đặt với Python
def checkYear(year): # Return true if year is a multiple # of 4 and not multiple of 100. # OR year is multiple of 400. return (((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0)); year = 2000 if(checkYear(year)): print("Leap Year") else: print("Not a Leap Year")
Trả lời