f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
Çevrimiçi deneyin!
Nasıl çalışır
Xoring tarafından n ve n / 2 (bölünmesiyle 2 esas olarak son bit kapalı pirzola), yeni bir tam sayı almak m olan sertleşmemiş bit bitişik bit eşleşen gösterir n .
Örneğin, n = 1337371 ise , aşağıdakilere sahibiz.
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
Bu, en uzun sıfır sırasını bulma görevini azaltır. Pozitif bir tamsayının ikili gösterimi her zaman 1 ile başladığından , m'nin ikili göstergesinde görünen en uzun 10 * rakam dizesini bulmaya çalışırız . Bu özyinelemeli yapılabilir.
Başlatma k olarak 1 . Her f çalıştırıldığında, ilk önce k'nin ondalık gösteriminin m'nin ikili gösterimi ile görünüp görünmediğini test ederiz . Eğer varsa, biz çarpın k tarafından 10 ve çağrı f tekrar. Olmazsa, sağındaki kod and
çalıştırılmaz ve False döndürürüz .
Bunu yapmak için önce hesaplıyoruz bin(k)[3:]
. Örneğimizde, bin(k)
döner '0b111100101110000010110'
ve 0b1
başında ile kaldırılır [3:]
.
Şimdi, -~
özyinelemeli çağrıdan önce her seferinde bir kez False / 0 artar f tekrarlanır. Bir kez 10 {j} ( 1 , ardından j tekrarlarının 0 ikili gösterimi görünmez) k , içinde sıfırların uzun çalışma k uzunluğu vardır j - 1 . Yana j - 1 ardışık sıfır k göstermektedir j eşleşen bitişik bit n , arzu edilen sonucu j biz arttırılmasıyla elde ne olduğu, yanlış / 0toplam j kez.