in

Bir haftanın gününü bulan algoritma

aftanın her günü bir numara verilir. Örneğin, Pazar haftanın ilk günüdür ve 1, Pazartesi 2 ile vb. Temsil edilir. Birkaç takvimde, hafta ISO 8601 standart takvimine benzeyen Pazartesi ve 7 Pazar gibi 1 ile başlar. Bu sayılar Modulo 7 kullanılarak elde edilmiştir.

1970 yılında, John Horton Conway sık sık “Kıyamet Günü Algoritması” olarak adlandırılan bir algoritmayla karşılaştı. (21 Aralık 2012 – öngörülen kıyamet günü ile hiçbir ilişkisi olmasa da) bir haftanın gününü hiçbir şeye başvurmadan hızlıca hesaplamak için kafanda birkaç hesaplama. (Ezberlemek kolaydır, bu yüzden endişelenmeyin.)

Bu algoritma şu formülü kullanır: (d + m + y + [y / 4] + c) mod 7

google

D gündeyken, m tarihte belirtilen aydır, y takvim yılıdır ve c yüzyıl sayısıdır.

Haftanın her günü bir numara verilir. Örneğin, Pazar haftanın ilk günüdür ve 1, Pazartesi 2 ile vb. Temsil edilir. Birkaç takvimde, hafta ISO 8601 standart takvimine benzeyen Pazartesi ve 7 Pazar gibi 1 ile başlar. Bu sayılar Modulo 7 kullanılarak elde edilmiştir.

Biz ne biliyoruz?

Her yılın 365 günü olduğunu biliyoruz (366 günü olan artık yıl hariç). Her hafta 7 gündür. Her ay Şubat ayının 30 veya 31 günü olup, ortak bir takvim yılında 28 gün ve artık yılda 29 gün vardır.

365 mod 7 = 1 olduğundan, her yıl bir önceki günün başladığı günden sonraki güne başlar. Öyleyse 1 Ocak 2001, 1 Ocak 2002 Pazartesi ise, 2002 artık bir yıl olmadığından Salı günü düşecek.

Yılın 11 ayı 30 veya 31 gün olsa da, bazı aylar tam olarak diğer aylarla aynı gün başlar.

Bir örnek alalım.

Nisan 2016 Cuma günü başlar, Temmuz 2016 da başlar. Nasıl? Nisan ayının 30 gün, 31 Mayıs günü, Haziranın ise 91 güne kadar 30 günü vardır.

91 modulo 7 = 0, geri kalanı sıfır ile döndürür. Bu nedenle, Temmuz, Nisan ayındaki gibi aynı gün başlar.

İyi haber şu ki, yılın diğer aylarıyla aynı gün başlayacak bir sürü ayımız var.
Ortak yıllar için:
Ocak ve Ekim
Şubat, Mart ve Kasım
Nisan ve Temmuz
Hiçbir ay Ağustos ayına karşılık gelmez

Artık yıllar için:
Ocak, Nisan ve Temmuz
Şubat ve Ağustos
Mart ve Kasım
Ayları ekim ayına denk gelmez

Bu algoritmaları takiben, Tomohiko Sakamoto, bir haftada geçen günün belirlenmesi için yukarıdaki formülü kullanan bir algoritma geliştirdi; bu, artık bir yılda ek günü de göz önüne aldı.

Tomohiko Sakamoto’nun haftanın gününü belirlemek için Kıyamet Algoritmasını nasıl kullandığını görelim.

Ocak 31 gündür, hangi 7 gün bir haftaya bölünürse 7 verir? 4 + 3 gün, bu nedenle 1 Şubat’ın 1 Ocak’tan sonraki gün 3 gün olacağını biliyoruz.

Benzer şekilde, 31 Ocak + 28 Şubat = = 59 gün, 7? 8 +3 ve 1 Mart’ın 1 Ocak’tan sonraki gün 3 gün düşeceğini söylediğimizde mantıklı geliyor.

Böylece, ayın ilk gününün bir ile temsil edildiği 1 Ocak {{0,3,3,6,1,4,6,2,5,0,3,5} ‘e karşılık gelen her ayın bir alt kümesini alırız. alt kümedeki numara.

Şimdi 365 gün bir yıl, hangisi 7? 52 + 1.

Her yıl fazladan bir gün eklenmesi, her 4 yılda bir artık yıl, yani 29 Şubat olarak düzenlenir.

Böylece, her 4 yılda bir, Gregoryen takvimi bir gün fazladan kazanıyor.

100 yıldan sonra olmayan ve takvim her 400 yılda bir tekrar ettiği için, 400. yılda yine fazladan bir gün kazanıyor.

Neden bu kadar karmaşık hale getirmek zorundalar?

Her şeyi matematiksel olarak koymak için, y / 4 – y / 100 + y / 400 olarak ek bir gün ekleriz.

Artık yıl için tüm takvimler için geçerli olan yukarıdaki kuralları göz önüne alarak, artık yıl olup olmadığını görmek için bir yılı 4’e bölmeliyiz. Fakat 100, 4’e bölünebilir olsa da artık bir yıl olamaz, bu yüzden yıl / 100’ü çıkarırsınız. Belirtildiği gibi, her 400 yılda bir artık yıl olur, dolayısıyla yıl / 400 ekler. Tüm toplama ve çıkarma işlemleriyle, bir günü artık yıllara doğru şekilde ekliyoruz.

Güzel, artık artık yılı matematiksel olarak ayarladık. Çok zor değil, değil mi?

Ancak, fazladan gün Ocak ayında değil Ocak ayında gelir.

Algoritmanın çalışması için ilk iki aydan bir gün çıkardık:
y – = m <3

1’den 12’ye kadar olan ayları numaralandırdığımızda, 3’ten düşük bir değere sahip olan her ay için, bu durumda Ocak ve Şubat olacak, 1’i orijinal değerinden çıkarın, böylece Ocak 0 ve Şubat 1 olur.

Ancak bunu yapmak, artık olmayan yıllarda bile Şubat ve Ocak aylarından bir gün siler, bu da Şubat ve Mart ayları arasında boş bir gün bırakır. Bunu önlemek için, her ay Mart ayından Aralık ayına kadar bir gün çıkaralım. bu:

{0,3,2,5,0,3,5,1,4,6,2,4}

Aşağıdaki kodlar Pazartesi 1 ve Pazar 7 olarak verecektir:

Bu nihayet bize aşağıdaki C ++ kodunu verir:

{
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

İşte Algoritma için bir Python Kodu

def day_of_week(year, month, day):
	t = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]
	year -= month < 3
	return (year + int(year/4) - int(year/100) + int(year/400) + t[month-1] + day) % 7

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yazar Cem Y.

Altı Derece Ayırma Teorisi

ASP.Net Core 3 ile Angular Kullanarak Hesap Makinesi Yapmak