Was ist der beste Weg, um alle Teiler einer Zahl zu bekommen?
Hier ist die sehr dumme Art und Weise:
def divisorGenerator(n):
for i in xrange(1,n/2+1):
if n%i == 0: yield i
yield n
Den Ergebnissen, die ich möchte zu bekommen, ist ähnlich wie diese, aber ich möchte ein intelligenter Algorithmus (es ist zu viel, langsam und dumm 🙂
Finde ich die wichtigsten Faktoren und deren Vielzahl schnell genug ist.
Ich habe einen generator, der erzeugt Faktor in dieser Art:
(factor1, multiplicity1)
(factor2, multiplicity2)
(factor3, multiplicity3)
und so weiter...
D. H. der Ausgang des
for i in factorGenerator(100):
print i
ist:
(2, 2)
(5, 2)
Ich weiß nicht, wie viel ist das sinnvoll für das, was ich tun will (ich codiert es für andere Probleme), auf jeden Fall würde ich wie ein intelligenter Weg, um
for i in divisorGen(100):
print i
Ausgabe:
1
2
4
5
10
20
25
50
100
UPDATE: Vielen Dank an Greg Hewgill und seine "smart-way" 🙂
Die Berechnung aller Teiler von 100000000 nahm 0.01 s mit seiner Art gegen die 39s, dass die dumme Art und Weise nahm Sie auf meine Maschine, sehr cool 😀
UPDATE 2: Aufhören zu sagen, das ist ein Duplikat von diese post. Berechnung der Anzahl der Teiler einer gegebenen Zahl muss nicht berechnet alle Teiler. Es ist ein anderes problem, wenn du denkst, es geht nicht dann suchen für die "Divisor function" auf wikipedia. Lesen Sie die Fragen und die Antwort vor der Buchung, wenn Sie nicht verstehen, was ist das Thema gerade nicht hinzufügen, die nicht nützlich sind, und die bereits gegebenen Antworten.
InformationsquelleAutor der Frage Andrea Ambu | 2008-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre factorGenerator Funktion, hier ist ein divisorGen, die funktionieren sollte:
Die Effizienz dieses Algorithmus hängt ganz auf die Effizienz der factorGenerator.
InformationsquelleAutor der Antwort Greg Hewgill
Ergänzen, was Shimi hat gesagt, Sie sollte nur läuft die Schleife von 1 bis zur Quadratwurzel von n ist. Dann finden Sie das paar, tun
n /i
, und das deckt das ganze problem Raum.Da wurde auch festgestellt, dies ist ein NP oder "schwierig" problem. Erschöpfende Suche, die Art und Weise Sie es tun, ist ungefähr so gut wie es geht für garantierte Antworten. Diese Tatsache wird von Verschlüsselungs-algorithmen und dergleichen zu schützen. Wenn jemand um dieses problem zu lösen, die meisten, wenn nicht alle unsere aktuellen 'sichere' Kommunikation dargestellt werden unsicher.
Python-code:
Sollte eine Liste ausgeben wie:
InformationsquelleAutor der Antwort Matthew Scharley
Zwar gibt es bereits zahlreiche Lösungen, ich habe wirklich zu diesem post 🙂
Dieser ist:
Code:
InformationsquelleAutor der Antwort Tomas Kulich
Ich wie Greg Lösung, aber ich wünschte, es war mehr wie python.
Ich glaube, es wäre schneller und besser lesbar;
so nach einiger Zeit der Codierung kam ich mit diesem.
Die ersten beiden Funktionen sind notwendig, um das kartesische Produkt von Listen.
Und kann wiederverwendet werden whnever dieses problem entsteht.
Übrigens, ich mußte das selbst, wenn jemand weiß, eine standard-Lösung für dieses problem gibt, fühlen Sie bitte sich frei, mich zu Kontaktieren.
"Factorgenerator" kehrt nun ein Wörterbuch. Und dann das Wörterbuch zugeführt wird "Teiler", die Sie verwendet, zu generieren, wird zunächst eine Liste von Listen, wobei jede Liste ist die Liste der Faktoren von der form p^n mit p Primzahl.
Dann machen wir das kartesische Produkt von diesen Listen, und wir endlich mit Greg' Lösung zu generieren, ist der divisor.
Wir Sortieren Sie und geben Sie Sie zurück.
Habe es getestet und es scheint ein wenig schneller als die Vorherige version. Getestet habe ich es als Teil eines größeren Programms, also kann ich nicht wirklich sagen, wie viel ist es schneller wenn.
Pietro Speroni (pietrosperoni dot)
P. S.
es ist das erste mal, dass ich bin Entsendung auf stackoverflow.
Ich freue mich für jedes feedback.
InformationsquelleAutor der Antwort Pietro Speroni
Ich denke, Sie können stoppen Sie am
math.sqrt(n)
statt n/2.Werde ich Ihnen Beispiel, so dass Sie verstehen es einfach. Jetzt die
sqrt(28)
ist5.29
soceil(5.29)
6. Also ich wenn ich halt bei 6 dann werde ich all die Teiler. Wie?Sehen zuerst den code und dann siehe Bild:
Nun, Siehe Bild unten:
Können sagen, ich habe bereits Hinzugefügt
1
zu meiner Teiler Liste und ich beginne miti=2
soAlso am Ende aller Iterationen, da habe ich Hinzugefügt, der quotient und divisor auf meiner Liste, die Teiler von 28 sind aufgefüllt.
Hoffe, das hilft. Wenn Sie irgendwelche Zweifel haben zögern Sie nicht uns zu ping zurück und ich werde froh sein, Ihnen zu helfen :).
Quelle: Gewusst wie: bestimmen der Teiler einer Zahl
Radius des Kreises - Code und Bild
InformationsquelleAutor der Antwort Anivarth
Angepasst CodeReview, hier ist eine Variante, die funktioniert mit
num=1
!InformationsquelleAutor der Antwort YvesgereY
Alte Frage, aber hier ist mein nehmen:
Können Sie proxy mit:
HINWEIS: Bei Sprachen, die Unterstützung, könnte dies tail-rekursiv.
InformationsquelleAutor der Antwort joksnet
Hier ist eine intelligente und schnelle Möglichkeit, es zu tun für zahlen bis etwa 10**16 in reinem Python-3.6,
InformationsquelleAutor der Antwort Bruno Astrolino
Unter der Annahme, dass die
factors
Funktion gibt die Faktoren n (zum Beispielfactors(60)
liefert die Liste [2, 2, 3, 5]), hier ist eine Funktion zum berechnen der Teiler von n:InformationsquelleAutor der Antwort user448810
Hier ist meine Lösung. Es scheint dumm, aber funktioniert gut...und ich war auf der Suche nach der richtigen Teiler, so dass die Schleife gestartet von i = 2.
InformationsquelleAutor der Antwort Amber Xue
Wenn Sie interessieren sich nur mit list Verstehens und nichts anderes zählt auf Sie!
InformationsquelleAutor der Antwort Sadiq
InformationsquelleAutor der Antwort user3697453
Für mich dies funktioniert gut und ist auch sauber (Python 3)
Nicht sehr schnell, aber zurück Teiler Zeile für Zeile, wie Sie wollten, Sie können auch do-Liste.append(n) und der Liste.append(Zahl), wenn Sie wirklich wollen, um
InformationsquelleAutor der Antwort tomekch6