Th u t toán Doomsday Gi i thi u: bi t m t ngày n m th m y b n làm t h nào? Có l b n s c n m t quy n l ch đ dị tìm Tuy nhiên, k hông c n đ n l ch, v n có th tính đ c th c a b t k ngày t r ong b t c n m B n có ngh tơi “x o” khơng? B n t heo 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à t oán h c n i ti ng, r i b n s th y nh ng t nói khơng sai Cách t ính t i n s Conway phát minh vào n h ng n m 1970, đ c coi ph ng pháp đ n gi n d nh nh t so v i cách tính th khác (2) D o om sday c a m t n m g ì?: Tr c tiên, b n c n bi t v khái ni m Doomsday Doomsday c a m t n m ngày cu i c a tháng hai, t c ngày / n m th ng / n m nhu n (3) Ví d nh Doomsday c a n m 2004 (n m nhu n) ch nh t 29/2 Khi bi t đ c Doomsday, b n s tính đ c th c a ngày khác t rong t háng hai b ng cách l y Doom sday làm m c tính ng c l i t ng tu n Ch ng h n nh đ bi t ngày 14/ 2/ 2004 t h m y, b n làm nh sau: 29- 7= 22, 22- 7=15, ngày 22/2 15/2 đ u ch nh t, nh v y 14/2 t h b y Cách tính đ i v i nh ng tháng ch n: B n t ính đ c th c a ngày tr ong t háng hai, cịn nh ng tháng khác sao? Tr c tiên, chúng t a nói v nh ng tháng ch n (các tháng 4, 6, 8, 10, 12) i v i tháng ch n này, ngày sau s có th t rùng v i Doomsday: / , / , / , / , / Th t d nh ph i không b n? Trong n m 2004, ngày đ u 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 t r ong t háng ch n Cách tính đ i v i nh ng tháng l : i v i nh ng tháng l tính nh th nào? Cách t ính c ng t ng t nh trên, nhiên c n nh m t ngày t r ong tháng có t h trùng v i Doomsday Tr c h t xét tháng 5, 7, 9, 11 Các ngày / , / , 1 / , / 1 s có th trùng v i Doomsday Cịn t háng ba t hì sao? Doom sday ( 28/ h o c 29/2) có th t rùng v i Doomsday coi ngày 0/ Vì v y ngày / s có th Có m t cách giúp b n nh ngày t rên c a tháng l (tr tháng 1) i v i nh ng tháng 3, 5, nh ng tháng dài ( 31 ngày) , b n l y tháng c ng thêm s ngày c n nh (tháng 3: 3+4=7 => ngày 7/ 3; tháng 5: 5+ 4= = > ngày 9/ 5; tháng 7: 7+ 4= 11 = > ng ày 11/7), i v i nh ng tháng 9, 11 nh ng t háng ng n (30 ngày ) , b n l y tháng tr s ngày c n nh (tháng 9: 9- 4= = > ngày 5/ 9; tháng 11: 1- 4= = > ngày 7/ 11) Tháng m t h i đ c bi t V i n m th ng, ngày / s có th trùng v i Doomsday ( 28 ngày sau ngày 31/ ngày 28/ Doom sday ) V i n m nhu n, Doomsday ngày 29/2 nên ngày 1/2 (coi nh ngày 32/ 1) có t h trùng v i Doomsday, v y ngày 31/ có t h tr c Doomsday m t ngày B n c n ý m đ c bi t đ tính cho xác Sau đ c cách tính tháng m t c a ti n s Conway, m t đ c gi tên Bob Goddard đ ngh m t ngày k hác d nh h n đ i v i tháng m t ó ngày / n m th ng ngày / n m nhu n Các ngày có t h trùng v i Doomsday d nh , ta liên t ng s n m th ng chu k n m s có n m nhu n, cịn s g i ý đ n n m nhu n n m nhu n chia h t cho D o om sday c a n m th k 20: DeThiMau.vn Mu n tính th c a b t k ngày tr ong m t n m, b n c n bi t Doomsday c a n m Doomsday c a n m 2004 ch nh t 29/2, v y Doomsday c a n m 2003 t h m y? Xin tr l i b n th sáu B i n m 2004 n m nhu n có 366 ngày, 366 chia d 2, v y Doomsday c a n m 2003 có th tr c Doom sday c a n m 2004 hai ngày nên t h sáu T ng t , Doomsday c a n m 2002 t h n m n m 2003 có 365 ngày, 365 chia d Nh v y, đ tính Doomsday c a m t n m tr c n m th ng, b n lùi ngày, đ tính Doomsday c a m t n m tr c n m nhu n, b n lùi ngày ( B n l u ý n m nhu n d ngày t hì ngày nh h ng đ n n m tr c ch khơng ph i n m sau Doom sday c a n m nhu n ngày 29/ ch không ph i 28/2) Áp d ng cách này, bi t Doomsday c a m t n m đó, ta tính đ c Doom sday c a nh ng n m khác B ng bên Doom sday c a nh ng n m th k 20 (n m in đ m n m nhu n) Ph n l n chúng t a sinh s ng th k 20 nên có l b ng s đ c dùng nhi u Tuy nhiên, th t khó đ nh đ c m i chi ti t 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 t h k 20 Tr c h t b n c n ghi nh Doomsday c a n m 1900 t h t C n m có m t n m nhu n, v y Doom sday m i n m cách ngày T ng t , Doomsday m i n m cách 10 ngày , ngày (10 chia d 3), Doomsday m i 12 n m cách 15 ngày, ngày Ta s ghi nh chu k 12 n m (ti n l i s chênh l ch ch 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 t h b y, b i Doom sday c a n m 1900 t h t nên Doom sday c a n m 1912 (12 n m sau) t h n m nên Doom sday c a n m 1914 t h b y i v i m t n m b t k th k 20 (19YY), b n tính Doomsday theo quy t c sau: - a th ng s c a phép chia YY cho 12 - b s d - c th c a phép chia YY cho 12 ng s c a phép chia b cho (bi t s n m nhu n đ tính s ngày c ng thêm ) - d= a+ b+ c - e s d phép chia d cho - Doom sday c a n m 19YY s có th Ví d : Doomsday c a n m 1929 t h sau Doomsday c a n m 1900 (th t ) e ngày m y? Tr l i: a = 29 div 12 = 2; b = 29 mod 12 = 5; c = b div = div = 1; d = a+ b+ c = 2+ 5+ = 8; e = d m od = m od = Sau t h t ngày (e=1) th n m Nh v y Doomsday c a n m 1929 t h DeThiMau.vn n m D o om sday c a n m đ u 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 đ b n c n bi t Doomsday c a n m đ u tiên c a th k B ng d i cung c p cho b n Doomsday c a n m đ u c a m t s th k nhó b ng c ng khơng q khó ng d ng: N u b n có kh n ng nh tính tốn t ng đ i nhanh cách t ính t rên ( c ng không ph c t p đ nh ) giúp b n có th tính nh m th c a b t k ngày i u n b n ch ng khác 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ó t h áp d ng cách tính vào ch ng t rình c a 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 t h k ”, đ i v i nh ng ch ng t r ì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 hy v ng c ng s mang l i ích l i cho b n B n có th t i ch ng trình Doom sday có s d ng cách tính đ kham th o Ch ng tr ình v i t b ng Visual Basic, nh m minh h a cách “tin h c hóa” thu t tốn Doomsday, có th tính th m t ngày b t k in l ch c a n m (Th c v i kh n ng tính c a máy tính khơng c n s d ng thu t toán Doom sday c ng tính đ c th c a m t ngày b t k Ví d nh bi t r ng hôm t h n m 7/10/2004 t hì đ n thu n ch c n đ m ng c l i ho c đ m lên đ tính th m t ngày b t k ) DeThiMau.vn