Xác định năm này có phải là năm nhuận hay không

Dữ liệu đầu vào là 1 chuỗi viết theo định dạng sau: ngày/tháng/năm, trong đó:

  • ngày là một số nguyên dương >= 1 và <=31
  • tháng là một số nguyên dương >=1 và <=12
  • năm là một số nguyên dương >=1 và <=10000
    Yêu cầu: Xuất ra 2 dòng
  • Dòng 1: xác định năm này có phải là năm nhuận hay không?
    Nếu năm nhuận thì ghi là YES
    Ngược lại ghi là NO
  • Dòng 2: kết quả phép toán: ngày + tháng + năm, ghi theo cấu trúc:
    Ngày+tháng+năm=KếtQuả

Ví dụ:

Input:

28/5/2015

Output:

NO
28+5+2015=2048

Ghi chú: cách xác định năm nhuận: năm nhuận là năm chia hết cho 400 hoặc chia hết cho 4 mà không chia hết cho 100
Ví dụ:
Năm 1800 không phải là năm nhuận
Năm 2000 là năm nhuận

1 Like

Khác nào chỉ cần chia hết cho 4?

năm 700 hoặc năm 900 thì không thỏa điều kiện bạn ơi.


bài này bạn chỉ cần mô tả điều kiện phù hợp là được thôi. Cố lên bạn.

1 Like

4 năm 1 lần có 1 năm nhuận, mà năm nhuận gần nhất là 2012 mod 4 = 0 => năm nhuận là năm chia hết cho 4 thôi mà ?

như thế này mới đủ @ntridan

1 Like

Lấy 2 số cuối mà chia hết cho 4 là đủ kết luận năm nhuận.

Mình vẫn thấy có gì đó k logic. Năm chia hết cho 400 hoặc chia hết cho 4không chia hết cho 100.
Năm chia hết cho 400 thì tất nhiên là chia hết cho 4 rồi, còn chia hết cho 4 mà không chia hết cho 100 là những năm mà số của nó chia hết cho 4 còn lại (những năm không chia hết cho 400). Một số chia hết cho 400 là một số vừa chia hết cho 4 vừa chia hết cho 100 đúng không nhỉ ? :smile:

1 Like

Nếu chỉ chia hết cho 4 là năm nhuận vậy thì các năm 1800, 1900 là nhuận hết sao :joy:

Hình như là lịch mình đang dùng có sự cộng thêm/bớt đi gì đó nên mới có hiện tượng này thì phải :blush:

1 Like

Ừ vì 1800 nó chia hết cho 400, còn 1900 nó chia hết cho 4 mà không chia hết cho 100 (Theo như điều kiện logic của bài toán :)))
Điều kiện là (n chia hết cho 4) hoặc (n chia hết cho 4 mà không chia hết cho 100) mà :v Thỏa 1 trong 2 điều kiện trên máy sẽ trả kết quả là TRUE :))

:blush:

##Lịch Gregorius
Theo lịch Gregorius - loại lịch tiêu chuẩn hiện nay được dùng trên hầu khắp thế giới thì những năm nào chia hết cho 4 được coi là năm nhuận. Trong năm nhuận, tháng 2 có 29 ngày thay cho 28 ngày. Cứ 4 năm lại thêm 1 ngày vào lịch bởi vì một năm dương lịch dài khoảng 365 ngày và 6 giờ.Ngoài ra, vẫn có một số ngoại lệ đối với nguyên tắc này vì một năm dương lịch ngắn hơn 365,25 ngày một chút. Những năm chia hết cho 100 chỉ được coi là năm nhuận nếu chúng cũng chia hết cho 400. Ví dụ, 1600 và 2000 là các năm nhuận nhưng 1700, 1800 và 1900 không phải năm nhuận. Tương tự như vậy, 2100, 2200, 2300, 2500, 2600, 2700, 2900 và 3000 không phải năm nhuận nhưng 2400 và 2800 là các năm nhuận.

Theo nguyên tắc này thì trung bình một năm có 365 + 1/4 − 1/100 + 1/400 = 365,2425 ngày, tức là 365 ngày 5 giờ 49 phút và 12 giây. Lý do nằm sau quy tắc này như sau:Lịch Gregory được tạo ra để đảm bảo ngày xuân phân ở châu Âu rơi vào ngày 21 tháng 3, để đảm bảo ngày lễ Phục Sinh có thể điều chỉnh theo ngày xuân phân một cách rõ ràng hơn.Một năm xuân phân (tính giữa hai điểm xuân phân kế tiếp nhau) là khoảng 365,242375 ngày.Quy tắc tính năm nhuận theo lịch Gregory lấy một năm trung bình là 365,2425 ngày.

Sự sai khác rất nhỏ này (trên 0,0001 ngày) có nghĩa là sai số thời gian sẽ tích lũy đủ một ngày trong khoảng 8.000 năm. Nhưng trong thời gian của 8.000 năm thì độ dài của một năm xuân phân cũng sẽ thay đổi theo một lượng mà người ta không thể dự báo chính xác trước (xem dưới đây). Vì thế quy tắc tính năm nhuận của lịch Gregory là đủ thỏa mãn.

2 Likes

Nói chung mình thấy điều kiện logic của bài toán có vấn đề, nếu mình là cái máy tính thực hiện thuật toán này thì khi gặp năm 1900 mình vẫn sẽ trả giá trị là TRUE do nó vẫn chia hết cho 4

Trong link kia có nói thế này , khả năng là có liên quan :blush:

This is related to the Year 2000 problem, because many computer programs would have calculated the leap year incorrectly in the year 2000.

(sự kiện Y2K)

1 Like

Không biết có cách nào để làm thuật toán này chính xác hơn không nhỉ :))

tiên đề mà bạn biết có vấn đề thôi, chứ logic của bạn thì không có vấn đề gì cả. :smile:
1900 chia hết cho 100 nên nó không thỏa đó bạn. nếu nó có dạng xx00 thì nó phải chia hết cho 400 thì nó mới là năm nhuận.

2 Likes

Nãy giờ đúng là suy nghĩ của mình có vấn đề =)) chính mình đang phủ định mình :)) Điều kiện đúng rồi :)) Giờ mới thấy

1 Like

Theo ý ban đầu của bạn là chỉ cần chia hết cho 4 thôi mà =))

1 Like

Thì bởi, mình nhầm =))

4 năm nhuận 1 lần thì chia hết cho 4 là nhuận thôi chứ nhở?

Ngoài ra, vẫn có một số ngoại lệ đối với nguyên tắc này vì một năm dương lịch ngắn hơn 365,25 ngày một chút. Những năm chia hết cho 100 chỉ được coi là năm nhuận nếu chúng cũng chia hết cho 400. Ví dụ, 1600 và 2000 là các năm nhuận nhưng 1700, 1800 và 1900 không phải năm nhuận. Tương tự như vậy, 2100, 2200, 2300, 2500, 2600, 2700, 2900 và 3000 không phải năm nhuận nhưng 2400 và 2800 là các năm nhuận.

Theo nguyên tắc này thì trung bình một năm có 365 + 1/4 − 1/100 + 1/400 = 365,2425 ngày, tức là 365 ngày 5 giờ 49 phút và 12 giây. Lý do nằm sau quy tắc này như sau:Lịch Gregory được tạo ra để đảm bảo ngày xuân phân ở châu Âu rơi vào ngày 21 tháng 3, để đảm bảo ngày lễ Phục Sinh có thể điều chỉnh theo ngày xuân phân một cách rõ ràng hơn.Một năm xuân phân (tính giữa hai điểm xuân phân kế tiếp nhau) là khoảng 365,242375 ngày.Quy tắc tính năm nhuận theo lịch Gregory lấy một năm trung bình là 365,2425 ngày.

(Trích wikipedia :smile: )

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?