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

  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007
  • Shaollin Animes

    Shaollin Ani

    19 HAZİRAN 2013