Oto bardzo głupi sposób:
def divisorGenerator(n):
for i in xrange(1,n/2+1):
if n%i == 0: yield i
yield n
Wynik, który chciałbym uzyskać, jest podobny do tego, ale chciałbym mądrzejszego algorytmu (ten jest zbyt wolny i głupi :-)
Potrafię wystarczająco szybko znaleźć czynniki pierwsze i ich krotność. Mam generator, który generuje czynnik w ten sposób:
(współczynnik1, krotność1)
(współczynnik2, krotność2)
(współczynnik3, krotność3)
i tak dalej ...
czyli wyjście
for i in factorGenerator(100):
print i
jest:
(2, 2)
(5, 2)
Nie wiem, na ile jest to przydatne w tym, co chcę robić (zakodowałem to pod kątem innych problemów), w każdym razie chciałbym mądrzejszego sposobu
for i in divisorGen(100):
print i
wyślij to:
1
2
4
5
10
20
25
50
100
AKTUALIZACJA: Wielkie dzięki dla Grega Hewgilla i jego "sprytnego sposobu" :) Obliczenie wszystkich dzielników na 100000000 zajęło mu 0,01s wobec 39-tych, które głupi sposób objął moją maszynę, bardzo fajnie: D
UPDATE 2: Przestań mówić, że to duplikat tego postu. Obliczenie liczby dzielników podanej liczby nie wymaga obliczania wszystkich dzielników. To inny problem, jeśli myślisz, że tak nie jest, poszukaj opcji „Divisor function” na Wikipedii. Przeczytaj pytania i odpowiedź przed wysłaniem, jeśli nie rozumiesz, jaki jest temat, po prostu nie dodawaj nieprzydatnych i już udzielonych odpowiedzi.