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
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.
Π değerini almak için en hızlı yolu ne...
Şu anda Simgelerini destekleyen tüm ta...
XmlDocument Satır sonları girintili XM...
Bir iterable ilk öğenin durumu eşleşen...
Bir nesneyi klonlamak için en etkili y...