Leap Year
Miladi takvimden bir year yılı verilir. 29 Şubat içeren artık bir yılsa true, değilse false döndürün.
Bir yıl, 4 ile tam bölünüyorsa artık yıldır; ancak 100 ile tam bölünen yıllar, aynı zamanda 400 ile de tam bölünmedikçe artık yıl değildir.
Fonksiyon
- yearinteger
- kontrol edilecek yıl
- Döndürürboolean
- yılda 29 Şubat varsa true, yoksa false
Kısıtlar
1 ≤ year ≤ 106
Örnekler
- Girdi
- year = 2024
- Çıktı
- true
- Açıklama
2024,4'e bölünebilir ve yüzyıl yılı değildir; bu nedenle artık yıldır.
- Girdi
- year = 1900
- Çıktı
- false
- Açıklama
1900,4'e bölünebilir; ancak100'e de bölünür ve400'e bölünmez. Bu nedenle yüzyıl istisnası geçerlidir ve artık yıl değildir.
- Girdi
- year = 2000
- Çıktı
- true
- Açıklama
2000,100ile kalansız bölünebildiği için artık yıl olmasını engeller; ancak400ile de kalansız bölünebildiğinden tekrar artık yıl olur. Artık yıldır.
Gönderirken +16 gizli test
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
4'e bölündükten sonra kalan0olması ilk kuraldır. Hangi yıllar bu kuralı bozar?Yüzyıl yılları bunu bozar;
400'ün katları da yüzyıl kuralını bozar.400'ün her katı aynı zamanda100'ün ve4'ün de katıdır; bu nedenle kontrollerinizin sırası sonucu belirler.Önce
400ile, ardından100ile, sonra da4ile bölünebilirliği kontrol et ve eşleşen ilk kuralın belirleyici olmasını sağla. Ya da bunları birleştir: 4 ile bölünebilir ve 100 ile bölünemez veya 400 ile bölünebilir.
Çözüm
Her kural yalnızca bir kalan gerektirir; dolayısıyla yapılacak iş üç bölünebilme kontrolüdür. Tuzak sıralamadadır: kurallar, yüzyıl yılı olan ve aynı zamanda 400'ün katı olan 2000 gibi yıllarda birbiriyle çelişir. Ya en özel kuralı önce kontrol edin ya da istisnaları yerinde tutan parantezlerle kuralı tek bir ifade olarak yazın.
Kuralları en öznelden en genel olana doğru kontrol edin
Sezgi
Bu üç kural, bir istisnalar zinciri oluşturur. 4 ile bölünebilmek yılı artık yıl yapar; 100 ile bölünebilmek bunu geçersiz kılar; 400 ile bölünebilmek ise bu geçersiz kılmayı geçersiz kılar. Daha sonraki bir kurala uyan yıl, her zaman önceki kurallara da uyar: 400'ün her katı 100'ün, 100'ün her katı da 4'ün katıdır.
Bu nedenle, eşleşen en özel kural sonucu belirler. Önce 400'ü, sonra 100'ü, ardından 4'ü kontrol et ve bir eşleşme bulur bulmaz sonucu döndür. 2000 için ilk kontrol zaten evet sonucunu verir. 1900 için ilk kontrol başarısız olur ve ikinci kontrol hayır sonucunu verir. 2024 için ilk iki kontrol başarısız olur ve üçüncü kontrol evet sonucunu verir.
Üç kuraldan hiçbiri eşleşmezse yıl 4'e hiç bölünmüyor demektir; dolayısıyla sıradan bir yıldır.
Algoritma
year % 400 == 0isetruedöndür.year % 100 == 0isefalsedöndür.year % 4 == 0isetruedöndür.- Aksi takdirde
falsedöndür.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseBir boole ifadesi
Sezgi
Kuralı, artık yıl olmanın iki yolu olarak okuyun. Yıl 4’e bölünebilir ve yüzyıl yılı olmayabilir ya da 400’e bölünebilir. Bu cümle kelimesi kelimesine (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 ifadesine karşılık gelir.
Üç örnekte kontrol edin. 2024 ilk koşulu sağlar. 1900 yüzyıl yılı olduğu için ilk koşulu sağlamaz ve 1900 % 400 sonucu 300 olduğu için ikinci koşulu da sağlamaz. 2000, 1900 ile aynı nedenle ilk koşulu sağlamaz ve ikinci koşulu sağlar.
İfadeyi başka şekilde de gruplandırabilirsiniz: 4’e bölünebilir ve ya yüzyıl yılı değildir ya da 400’ün katıdır. Her iki biçim de her yıl için aynı sonucu verir. İfade, if zinciriyle en fazla aynı üç kontrolü yapar.
Algoritma
year % 4 == 0 and year % 100 != 0ifadesini hesapla: 4'e bölünebilir ve yüzyıl yılı değildir.year % 400 == 0ifadesini hesapla.- Koşullardan herhangi biri sağlanıyorsa
truedöndür.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Tuzaklar ve uç durumlar
Buradaki her hata, kuralı bir istisnalar zinciri yerine tek bir test olarak ele almaktan kaynaklanır.
- Yalnızca
year % 4 == 0kontrolünü yapmak. Bu,1901ile2099arasındaki her yıl için doğru sonucu verir; bu yüzden hata gizli kalır. Ancak1900ve2100için yanlış sonuç verir. - Bir if zincirinde
400değerinden önce100değerini test etmek. Yüzyıl testi,400testi çalışmadan önce2000içinfalsesonucunu verir. - 4'e bölünebilme koşulunu kaldırmak.
year % 100 != 0 or year % 400 == 0,2023bir yüzyıl yılı olmadığı için onu artık yıl olarak kabul eder. - Kalanı kastettiğiniz hâlde
year / 4kullanmak. Bölme,4sayısının kaç kez sığdığını; kalan ise tam olarak bölünüp bölünmediğini gösterir.
Sıkça sorulan sorular4
Artık yıl kuralı nedir?
Miladi takvimde bir yıl, 4'e bölünebiliyorsa artık yıldır; ancak 100'e de bölünebiliyorsa artık yıl değildir. 400'e bölünebilen bir yıl ise yine de artık yıldır. Bu nedenle 2024 ve 2000 artık yıldır; 1900 ve 2100 ise değildir.
1900 neden artık yıl değilken 2000 artık yıldır?
Her ikisi de yüzyıl yılıdır ve 100 ile tam bölünür; bu da normalde bir yılı artık yıl olmaktan çıkarır. 2000 ayrıca 400 ile tam bölünür ve bu kural, yüzyıl kuralını geçersiz kılar. 1900, 400 ile bölündüğünde 300 kalanını verir; bu nedenle normal yıl olarak kalır.
Yüzyıl kuralları neden var?
Bir güneş yılı yaklaşık 365.2422 gün sürer. Her 4 yılda bir gün eklemek ortalamayı 365.25 yapar; bu da her 400 yılda yaklaşık 3 gün fazladır. Her 4 yüzyıl yılının 3'ünde artık günü atlamak bu 3 günü çıkarır. Ortalama 365.2425 gün olur; bu da takvimin binlerce yıl boyunca mevsimlerle uyumlu kalması için yeterince yakındır.
Artık yıl olup olmadığını kontrol etmenin zaman karmaşıklığı nedir?
Zaman ve bellek açısından O(1)’dir. Yılın büyüklüğü ne olursa olsun, kontrol en fazla üç kalan işlemi ve birkaç karşılaştırma gerektirir.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
Python
def isLeapYear(year):
# Kodu buraya yazınDurum 1
Durum 2
Durum 3
Girdi
year = 2024
Beklenen
true