ProjectEuler Çözümleri | Problem 2 | Python3

Selam arkadaşlar,
ProjectEuler.net web sitesindeki 2. problemin çözümünü python3 üzerinden göstereceğim.
Kodlar beni zorladı özellike döngüdeki değişken atama işlemlerinde beynim yandı neredeyse. Ama hallettim.

Problem:
Fibonacci dizisindeki 4000000’dan küçük olan çift sayıların toplamı kaçtır?

Cevap:
4613732

Kodlar:
Adsız

Kodlarınızı fotoğraf olarak değil de metin olarak (``` arasına alarak tabii) atmanız daha iyi olur. Bir de çözdüğünüz her soru için yeni bir konu açmanız hoş olmaz.

Sizin ilk konunuzu görünce benim de başlayasım geldi:

def fibonacci(i):
    x = 1
    y = 0
    z = 0
    while i > x:
        z = y
        y = x
        x = y + z
        yield x

sum_of = 0
for i in fibonacci(4000000):
    if not i%2:
        sum_of += i

print(sum_of)

Bir de kodunuzun sonundaki print(toplam + 2) bir sıkıntıya işaret ediyor, neden 2 ekliyoruz ki? Bu istisnayı ortadan kaldırmamız lazım.


toplam = int() de ne öyle? :frowning:

1 Beğeni

Dedikleriniz dikkate alacağım :+1:

1- +2 eklememizin nedeni ilk toplamdaki 2 sayısını elde edememesi.
2- toplam = int() yapma sebebim python’ın değişkenin türünü algılamasını sağlama.

Ben sizin kadar profesyonel olmadığım için elimden bu geliyor ancak.

Mesela bunu en başta toplam = 2 diyerek düzeltebiliriz.

Anlayamadım, toplam = 0 yapsanız değişkenin türü ile alakalı ne değişecek?

1 Beğeni

Üçüncü soruyu çözecek hızlı bir algoritma oluşturmanız zor olabilir, ben şuraya bir tane bırakıyım:

def find_largest_prime_factor(n):
    i = 2
    while i * i <= n:
        while not n % i:
            n //= i
            if i * i > n:
                break
        i += 1
        
    return n

print(find_largest_prime_factor(600851475143))
2 Beğeni

Bu kısmın olma olasılığı var mı?

1 Beğeni

Niçin denemiyorsunuz :slightly_smiling_face:

1 Beğeni

Bu durum için birşey değiştirmedi ama aklınızda ayırt edici bir değer var mı?

1 Beğeni

Evet bu durumda bir değişim yapmıyor ama tam kare sayılarda gerekli olduğunu söyleyebilirim.

1 Beğeni

@EkremDincel 5. soruyu yapabildiniz mi?

1 Beğeni
  1. soruyu yaptım ama biraz karışık oldu. Muhtemelen daha kısa bir yolu vardır ama bırakayım şuraya:
def prime_factors(num: int):
    divider = 2
    remaining = num
    while remaining != 1:
        while remaining % divider == 0:
            yield divider
            remaining /= divider
        divider += 1


def smallest_multiple(nums: list):
    result = []
    for num in nums:
        new_primes = list(prime_factors(num))

        for prime in set(new_primes):
            count = min(new_primes.count(prime), result.count(prime))
            for _ in range(count):
                result.remove(prime)
        
        result += new_primes
    return result


def product(nums: list):
    result = 1
    for num in nums:
        result *= num
    return result


numbers = range(1, 21)
factors = smallest_multiple(numbers)
multiple = product(factors)

print(multiple)
1 Beğeni
main = print $
  sum $ filter even $ takeWhile (<= 4000000) fib
  where
    fib = 1 : 1 : zipWith (+) fib (tail fib)
1 Beğeni

Ben onu haberim olmadan burada çözmüşüm:

1 Beğeni

@aib bunu hangi programlama dili ile yazdınız?

1 Beğeni

Haskell.

1 Beğeni

hocam bu algoritma işlemcim hızlı olsaydı beni sonuca götürür müydü? 3. problem için.

sayi = 600851475143
for i in range(1,sayi):
    while True:
        if sayi %i == 0:
            print(i)
            break

Sonuç ekrana yazılan sayı mı olacak?

dediğiniz gibi aynen öyle.

Ama ekrana bir sürü sayı yazılıyor?

1 Beğeni

En son yazılan sayı en büyük asal çarpanı olmuyor mu?