Project Euler 5. Soru Cevabı

Project Euler 5. Soru Cevabı

Project Euler 5. Soru Cevabı

stats = False
counter = 1
while stats == False:
    iStat = False
    for i in [11, 13, 14, 16, 17, 18, 19, 20]: # for i in range(1, 20) we pull the unnecessarily numbers the rest are [11, 13, 14, 16, 17, 18, 19, 20]
        if counter % i == 0:
            iStat = True
        else:
            iStat = False
            break
    if iStat == True:
        stats = True
        print(counter)
    counter += 1 

Mantık

Bu soruyu çözebilmek için bir while döngüsü ve sayaç kullanmayı mantıklı buldum çünkü sonsuza kadar gitme potansiyeli olan bir sayı var elimizde ve bu yüzden while ile sayacı sonsuza kadar arttırabiliriz.

Döngümüzün içinde "iStat" diye bir değişkenimiz var ve bu sayının bölünüp bölünmeme durumuna göre False/True değerini alıyor. True değerini aldığı zaman döngü kırılıyor ve sayı ekrana yazdırılıyor.

Burada en önemli nokta for döngüsünde içinde gezdiğimiz sayılar, normalde soruda bizden 1 - 20 arasındaki sayıları istiyor ancak biz [1,2,3,..,20] yapmak yerine sadece [11,13,14,16,17,18,19,20] sayılarının içinde geziyoruz ve bu bizim kodumuzu oldukça hızlandırıyor.

Burada bazı sayıları ayıklayabilmemizin sebebi ise şudur. 1 den 10 a kadar olan sayılar için en küçük değer zaten 2520 olarak karşımıza çıkıyor ve bu sayı bile 20 den büyük olduğu için bazı sayıları eleyebilmemize olanak sağlıyor.

Elediğimiz bazı sayıları değerlendirelim.

"1" İstediğimiz gibi eleyebiliriz çünkü tüm sayılar 1 sayısına bölünebilir.

"2 - Katları" Sayı 2 den büyük olması durumunda 2 nin katlarına bölünecektir ki 2520 sayısı 2 den büyük olduğu için 2 ve 2nin bir çok katını eleyebiliriz.

"3 - 9 " 3 - 9 a bölünme kuralına göre 18 e bölünebilen her sayı 3 - 9 a bölünebilir.

Unutanlar için hatırlatmak gerekir ise 1+8 = 9 yani 9 ve 3 sayısına bölünebiliyor.

 

Doğru cevabı görmek için burayı tıklayın.