SORU
5 EKİM 2008, Pazar


Bir sayının tüm bölenlerine almak için en iyi yolu nedir?

Burada çok aptalca bir şekilde

def divisorGenerator(n):
    for i in xrange(1,n/2 1):
        if n%i == 0: yield i
    yield n

Almak istiyorum sonuç buna benzer, ama daha akıllı bir algoritma istiyorum (bu çok yavaş ve aptalca :-)

Başbakan faktörleri ve onların çokluğu yeterince hızlı bulabilirsiniz. Bu faktörü üreten bir jeneratör aldım:

() factor1, multiplicity1< / ^ br . () factor2, multiplicity2< / ^ br . () factor3, multiplicity3< / ^ br . .

yani çıkış

for i in factorGenerator(100):
    print i

:

(2, 2)
(5, 2)

Yapmak istediğim şey için nasıl yararlı olduğunu bilmiyorum (diğer sorunlar için kodlanmış), yine de daha akıllı hale getirmek için bir yol istiyorum

for i in divisorGen(100):
    print i

bu çıktı:

1
2
4
5
10
20
25
50
100

< / ^ hr .

GÜNCELLEME:Çok teşekkürler Greg Hewgill ve onun için "akıllı yol" :) 100000000 aptal yolu makinem, çok güzel aldı o 39s karşı onun yolu ile 0.01 s aldı tüm altgruplar hesaplanırken.: D

GÜNCELLEME 2:Bu this yinelenen bir yazı olduğunu söyleyip durma. Verilen bir sayının bölen sayısını hesaplamak tüm bölenlerine hesaplamak için ihtiyacı yok. Eğer "wikipedia'da." Bölen fonksiyonu için bak değil bence farklı bir sorun var. Soruları okuyun ve eğer konunun ne olduğunu anlamak eğer göndermeden önce bu sorunun cevabını sadece yararlı değil ve zaten verilen cevaplar eklemeyin.

CEVAP
5 EKİM 2008, Pazar


FactorGenerator işlevi dikkate alındığında, burada çalışan bir divisorGen

def divisorGen(n):
    factors = list(factorGenerator(n))
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            f[i]  = 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i  = 1
            if i >= nfactors:
                return

Bu algoritma genel verimliliğini tamamen factorGenerator verimliliğine bağlıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006