Saturday, April 25, 2020

Thuật toán kiểm tra năm nhuận

1. Năm nhuận là gì?

Năm nhuận là những năm có 366 ngày (lịch dương)
Cứ 4 năm DL liên tiếp sẽ có một năm 366 ngày, gọi là năm nhuận.
Lịch tính thời gian theo mặt trời  được gọi là dương lịch. Là khi trái đất quay trọn một vòng xung quanh mặt trời mất 365 ngày 6 giờ. Năm dương lịch có số nguyên là 365 ngày. Như vậy, một năm dương lịch còn thừa lại 6 giờ và nếu 4 năm dồn lại sẽ thừa 24 giờ, tương ứng một ngày.  Ngày nhuận hay nhiều nơi gọi là ngày nhuần theo dương lịch được quy ước vào tháng 2 có 29 ngày thì ngày 29 tháng 2 được gọi là ngày nhuận, những năm có 356 ngày thì tháng 2 có 28 ngày.
Lịch tính thời gian theo mặt trăng được gọi là âm lịch. Tháng mặt trăng trung bình có 29,5 ngày. Một năm âm lịch có 354 ngày, nó ngắn hơn năm dương lịch đến 11 ngày. Vậy cứ 3 năm lại ngắn hơn 33 ngày (hơn 1 tháng).
Thuật toán kiểm tra năm nhuận

Để âm lịch vừa chỉ được tuần trăng, vừa không sai lệch nhiều với thời tiết của 4 mùa, thì cứ 3 năm âm lịch người ta phải cho thêm một tháng nhuận để năm âm lịch và dương lịch không sai nhau nhiều. Tuy nhiên, như vậy vẫn chưa đủ, năm âm lịch vẫn chậm hơn so với năm dương lịch. Người ta khắc phục tình trạng trên bằng cách là cứ 19 năm lại có một lần cách 2 năm thêm một tháng nhuận.
Trong 19 năm dương lịch có 228 tháng dương lịch, tương ứng với 235 tháng âm lịch, thừa 7 tháng so với năm dương lịch, gọi là 7 tháng nhuận. Bảy tháng trước đó được quy ước vào các năm thứ 3, 6, 9 hoặc 8, 11, 14, 17, 19 của chu kỳ 19 năm.

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é.
Sau đây là code kiểm tra năm nhuận sử dụng nhiều thể loại ngôn ngữ lập trình như sau:
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;
}
Kiểm tra năm nhuận bằng 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
}

No comments:

Post a Comment