2017-04-19 2 views
1

Ich muss eine Funktion schreiben Faktor, die einen ganzzahligen Parameter n nimmt, und gibt die kleinste Zahl von 2 bis n-1, die n teilt. Wenn keine solche Nummer existiert, wird -1 zurückgegeben.Refining-Faktoren in Python

Ich war in der Lage, die Funktion zu erstellen, um die Faktoren zu finden, bin aber unsicher, wie man es verfeinert, um das korrekte Ergebnis zurückzugeben.

def factors(n): 
    i = n 
    lst=[] 
    while i > 0: 
     if n % i == 0: 
     lst.append(i) 
     i -= 1 
    print(lst) 
    result=[i for i in lst if i > 2 and i < n-1] 
    print(result[1]) 



def main(): 
    n=int(input("Enter n:")) 

    factors(n) 

main() 
+2

Sie nichts zurück haben in Ihren 'Faktoren (n)' – haifzhan

+1

Willkommen bei Stackoverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. Was macht Ihr Programm gerade und wo scheitert es? – Prune

Antwort

3

Sie können das Listenverständnis verwenden, um die Faktoren einer Zahl zu finden. Um Ihre Lösung zu optimieren, müssen Sie nur bis zur Hälfte der Anzahl ausführen.

z.B. für 12 kann der maximale Faktor von 12 6 sein.

Eine Zahl größer als die Hälfte dieser Zahl kann nicht ihr Faktor sein. Daher müssen Sie Ihre Schleife nicht bis n-1 ausführen.

>>> [n for n in range(2, number/2+1) if number % n == 0] 

In der oberen Zeile werden wir eine Schleife von 2 to (number/2 + 1) und prüfen Sie laufen, wenn die Zahl von n teilbar ist, es dann zu der Liste hinzufügen.

1

Ihre factor Funktion vom kleinsten Wert zuerst aussehen sollte, dann starten

zunehmende
def factor(n): 
    i = 2 
    while i < n: 
     if n % i == 0: 
      return i 
     i += 1 
    return -1 

>>> factor(6) 
2 
>>> factor(21) 
3 
>>> factor(49) 
7 
>>> factor(13) 
-1 

Dann factors nennen kann, dass

def factors(n): 
    values = [1] 
    while n > 1: 
     f = factor(n) 
     if f > -1: 
      values.append(f) 
      n //= f 
     else: 
      values.append(n) 
      break 
    return values 

>>> factors(21) 
[1, 3, 7] 
1

Sie hier eine Menge unnötiger Arbeit zu tun: Sie finden alle Faktoren, anstatt nur die kleinsten. Allerdings haben Sie tun eine richtige Antwort auf Knopfdruck: Sie drucken das zweite Element als den niedrigsten Faktor, aber Ihre Liste ist in umgekehrter Reihenfolge. Versuchen

print lst[-2] 

Das heißt Sie wirklich nicht mit all das stören sollte. Beginnen Sie stattdessen bei 2 und arbeiten Sie nach oben, um nach dem kleinsten Faktor zu suchen. Wenn Sie zu sqrt (n) gelangen, ohne einen zu finden, geben Sie ein Ergebnis von -1 zurück.

+0

Upvote den pädagogischen Ansatz. Sie sollten jedoch einen Hinweis auf einen besseren Weg hinzufügen. – kabanus

+1

Ich tat es, ungefähr zu der Zeit, als Sie Ihren Kommentar eintippten. – Prune

+0

Sprechen Sie über das Timing. Kann nicht zweimal upvote :) – kabanus

0

Hier wird so optimiert, für die Suche nach dem Faktor einer Zahl zwischen 2 oder n-1:

def factor(n): 
    i=2 
    a=[] 
    while i*i<=n: 
     if n%i==0: 
      if i!=n/i: 
       a.append(i) 
       a.append(n/i) 
      else: 
       a.append(i) 
     i+=1 
    a.sort() 
    print a 

n=int(input()) 
factor(n)