Thuật toán Doomsday Giới thiệu: Để biết một ngày nào đó trong năm là thứ mấy thì bạn làm thế nào? Có l ẽ bạn sẽ cần một quyển lịch để dò tìm. Tuy nhiên, không cần đến lịch, tôi vẫn có thể tính được thứ của bất kỳ ngày nào trong b ất cứ năm nào. Bạn có nghĩ tôi “xạo” không? Bạn hãy theo dõi cách tính thứ của một ngày bất kỳ theo ph ương pháp của tiến sĩ John Horton Conway (1), một nhà toán học nổi tiếng, rồi bạn sẽ thấy những gì tôi nói ở tr ên là không sai. Cách tính này do tiến sĩ Conway phát minh vào những năm 1970, được coi l à phương pháp đơn giản và dễ nhớ nhất so với các cách tính thứ khác (2). Doomsday của một năm là gì?: Trước tiên, bạn cần biết về khái niệm Doomsday. Doomsday của một năm là ngày cuối cùng c ủa tháng hai, tức là ngày 28/2 ở năm thường và 29/2 ở năm nhuận (3). Ví dụ như Doomsday c ủa năm 2004 (năm nhuận) là chủ nhật 29/2. Khi biết được Doomsday, bạn sẽ tính được thứ của các ngày khác trong tháng hai b ằng cách lấy Doomsday làm mốc và tính ngược lại từng tuần. Chẳng hạn như để biết ngày 14/2/2004 là th ứ mấy, bạn làm như sau: 29-7=22, 22-7=15, ngày 22/2 và 15/2 đều là chủ nhật, như vậy 14/2 là thứ bảy. Cách tính đối với những tháng chẵn: Bạn đã tính được thứ của các ngày trong tháng hai, còn những tháng khác thì sao? Trước ti ên, chúng ta nói về những tháng chẵn (các tháng 4, 6, 8, 10, 12). Đối với các tháng chẵn này, các ngày sau s ẽ có thứ trùng với Doomsday: 4/4, 6/6, 8/8, 10/10, 12/12. Th ật dễ nhớ phải không bạn? Trong năm 2004, các ngày trên đều là chủ nhật (trùng với thứ của ngày 29/2). Áp d ụng cách tính giống tháng hai, bạn sẽ tính được thứ của bất cứ ngày nào trong các tháng chẵn. Cách tính đối với những tháng lẻ: Đối với những tháng lẻ thì tính như thế nào? Cách tính cũng tương tự như trên, tuy nhiên chúng ta c ần nhớ một ngày trong tháng có thứ trùng với Doomsday. Trư ớc hết chúng ta xét các tháng 5, 7, 9, 11. Các ngày 9/5, 5/9, 11/7, 7/11 sẽ có thứ trùng với Doomsday. Còn tháng ba thì sao? Doomsday (28/2 hoặc 29/2) có thể coi là ngày 0/3. Vì vậy ngày 7/3 s ẽ có thứ trùng với Doomsday. Có một cách giúp bạn nhớ các ngày trên của các tháng lẻ (trừ tháng 1). Đối với những tháng 3, 5, 7 l à những tháng dài (31 ngày), bạn lấy tháng đó cộng thêm 4 sẽ ra ngày cần nhớ (tháng 3: 3+4=7 => ng ày 7/3; tháng 5: 5+4=9 => ngày 9/5; tháng 7: 7+4=11 => ngày 11/7), Đối với những tháng 9, 11 là nh ững tháng ngắn (30 ngày), bạn lấy tháng đó trừ đi 4 sẽ ra ngày cần nhớ (tháng 9: 9- 4=5 => ngày 5/9; tháng 11: 11-4=7 => ngày 7/11). Tháng một thì hơi đặc biệt. Với năm thường, ngày 31/1 sẽ có thứ trùng với Doomsday (28 ngày sau ngày 31/1 là ngày 28/2 chính là Doomsday). Với năm nhuận, Doomsday l à ngày 29/2 nên ngày 1/2 (coi như là ngày 32/1) có thứ trùng với Doomsday, do vậy ngày 31/1 có thứ trước Doomsday một ngày. B ạn cần chú ý điểm đặc biệt này để tính cho chính xác. Sau khi đọc cách tính trong tháng một của tiến sĩ Conway, một độc giả tên Bob Goddard đã đ ề nghị một ngày khác dễ nhớ hơn đối với tháng một. Đó là ngày 3/1 trong năm thường và ngày 4/1 trong năm nhuận. Các ngày này có thứ trùng với Doomsday. Để dễ nhớ, ta liên tưởng số 3 là 3 năm thư ờng trong chu kỳ 4 năm sẽ có năm nhuận, còn số 4 gợi ý đến năm nhuận vì năm nhuận chia hết cho 4. Doomsday của các năm trong thế kỷ 20: Muốn tính thứ của bất kỳ ngày nào trong một năm, bạn cần biết Doomsday của năm đó. Doomsday c ủa năm 2004 là chủ nhật 29/2, vậy Doomsday của năm 2003 là thứ mấy? Xin trả lời bạn là thứ sáu. Bởi v ì năm 2004 là năm nhuận có 366 ngày, 366 chia 7 dư 2, vì vậy Doomsday của năm 2003 có thứ trư ớc Doomsday của năm 2004 hai ngày nên là thứ sáu. Tương tự, Doomsday của năm 2002 là thứ năm vì n ăm 2003 có 365 ngày, 365 chia 7 dư 1. Như vậy, để tính Doomsday của một năm trước năm thường, bạn l ùi 1 ngày, để tính Doomsday của một năm trước năm nhuận, bạn lùi 2 ngày. (Bạn lưu ý là năm nhuận d ư ra 1 ngày thì ngày này ảnh hưởng đến năm trước đó chứ không phải năm sau nó vì Doomsday c ủa năm nhuận là ngày 29/2 chứ không phải 28/2). Áp dụng cách này, biết Doomsday của một năm nào đó, ta tính đư ợc Doomsday của những năm khác. Bảng bên là Doomsday của những năm trong thế kỷ 20 (năm in đậm là năm nhuận). Phần lớ n chúng ta sinh ra và sống trong thế kỷ 20 nên có lẽ bảng này sẽ được dùng nhiều. Tuy nhiên, thật khó để nhớ đư ợc mọi chi tiết trong bảng. Nhưng có một cách tính khác giúp bạn biết đư ợc Doomsday của từng năm trong thế kỷ 20. Trước hết bạn cần ghi nhớ Doomsday của năm 1900 là thứ tư. Cứ 4 năm thì có một năm nhuận, vì v ậy Doomsday mỗi 4 năm cách nhau 5 ngày. Tương tự, Doomsday mỗi 8 năm cách nhau 10 ng ày, hay là 3 ngày (10 chia 7 dư 3), Doomsday mỗi 12 năm cách nhau 15 ngày, hay là 1 ngày. Ta sẽ ghi nh ớ chu kỳ 12 năm này (tiện lợi vì con số chênh lệch chỉ là 1 ngày) đ ể tính nhanh Doomsday của một năm. Chẳng hạn như ta tính được Doomsday của năm 1914 là thứ bảy, bởi vì Doomsday của năm 1900 là thứ t ư nên Doomsday của năm 1912 (12 năm sau) là thứ năm nên Doomsday của năm 1914 là thứ bảy. Đối với một năm bất kỳ trong thế kỷ 20 (19YY), bạn tính Doomsday theo quy tắc sau: - a là thương số của phép chia YY cho 12 - b là số dư của phép chia YY cho 12 - c là thương số của phép chia b cho 4 (biết số năm nhuận để tính số ngày cộng thêm) - d=a+b+c - e là số dư phép chia d cho 7 - Doomsday của năm 19YY sẽ có thứ sau Doomsday của năm 1900 (thứ tư) e ngày. Ví dụ: Doomsday của năm 1929 là thứ mấy? Trả lời: a = 29 div 12 = 2; b = 29 mod 12 = 5; c = b div 4 = 5 div 4 = 1; d = a+b+c = 2+5+1 = 8; e = d mod 7 = 8 mod 7 = 1. Sau th ứ t ư 1 ngày (e=1) là th ứ năm. Nh ư v ậy Doomsday của năm 1929 l à th ứ năm. Doomsday của năm đầu trong một số thế kỷ: Đối với những thế kỷ khác, cách tính Doomsday cũng tương tự như đối với thế kỷ 20. Vấn đề ở đây là b ạn cần biết Doomsday của năm đầu tiên của thế kỷ. Bảng dư ới đây cung cấp cho bạn Doomsday của năm đầu của một số thế kỷ. Để nhó bảng này cũng không quá khó. Ứng dụng: Nếu bạn có khả năng nhớ và tính toán tương đối nhanh thì cách tính trên (c ũng không quá phức tạp để nhớ) giúp bạn có thể tính nhẩm thứ của bất kỳ ngày nào. Điều này khiến bạn chẳng khác gì m ột “quyển lịch sống”. Thật ấn tượng phải không bạn? Các bạn lập trình có thể áp dụng cách tính tr ên vào chương trình của mình. Chỉ với một số dòng lệnh tương đối đơn giản, bạn đã có một bộ lịch “liên th ế kỷ”, đối với những chương trình cần tra ngày tháng, bạn sẽ không tốn công lưu trữ lịch để tra cứu… Tôi nghĩ ph ương pháp trên rất hay, hữu dụng và hy vọng nó cũng sẽ mang lại ích lợi gì đó cho bạn. Bạn có thể tải chương trình Doomsday có sử dụng cách tính trên để kham thảo. Chương trình vi ết bằng Visual Basic, nhằm minh họa cách “tin học hóa” thuật toán Doomsday, có thể tính thứ một ngày bất kỳ v à in ra lịch của các năm. (Thực ra với khả năng tính của máy tính thì không c ần sử dụng thuật toán Doomsday cũng tính được thứ của một ngày bất kỳ. Ví dụ như biết rằng hôm nay là th ứ năm 7/10/2004 thì đơn thuần chúng ta chỉ cần đếm ngược lại hoặc đếm lên để tính thứ một ngày bất kỳ.) . nhanh Doomsday của một năm. Chẳng hạn như ta tính được Doomsday của năm 1914 là thứ bảy, bởi vì Doomsday của năm 1900 là thứ t ư nên Doomsday của năm 1912 (12 năm sau) là thứ năm nên Doomsday. vậy Doomsday của năm 2003 có thứ trư ớc Doomsday của năm 2004 hai ngày nên là thứ sáu. Tương tự, Doomsday của năm 2002 là thứ năm vì n ăm 2003 có 365 ngày, 365 chia 7 dư 1. Như vậy, để tính Doomsday. có thứ trùng với Doomsday (28 ngày sau ngày 31/1 là ngày 28/2 chính là Doomsday) . Với năm nhuận, Doomsday l à ngày 29/2 nên ngày 1/2 (coi như là ngày 32/1) có thứ trùng với Doomsday, do vậy