2016-10-20 4 views
0
x=int(input("Enter an integer:")) 
answer=None 
cube_root_found=False 
for i in range(0,abs(x)+1): 
    if i**3 == abs(x): 
     answer=i 
     cube_root_found=True 
if not cube_root_found: 
    print(x,"is not a perfect cube") 
else: 
    if x<0: 
     answer=-answer 
    print("Cube root of",x,"is",answer) 

Ich konnte nicht verstehen, warum wir Antwort verwendet = None und cube_root_found = False auf die zweite line.And die andere Frage ist, wie ich im Titel erwähnt: Wie können wir diesen Code effizienter zu gestalten?Wie können wir diesen Code effizienter machen?

+2

Sobald Sie eine Kubikwurzel gefunden haben, können Sie aus der Schleife ausbrechen. –

+1

Mögliches Duplikat von [Wie finde ich den Cube-Root mit Python?] (Http://stackoverflow.com/questions/28014241/how-to-find-cube-root-using-python) – cpatricio

Antwort

1

Das Hinzufügen eines break nach cube_root_found = True führt zu einem Kurzschluss, wenn eine Antwort gefunden wird und nicht weiter.

x=int(input("Enter an integer:")) 
answer=None 
cube_root_found=False 
for i in range(0,abs(x)+1): 
    if i**3 == abs(x): 
     answer=i 
     cube_root_found=True 
     break 
if not cube_root_found: 
    print(x,"is not a perfect cube") 
else: 
    if x<0: 
     answer=-answer 
    print("Cube root of",x,"is",answer) 
2

ich meine, es gibt eine mathematische Lösung für diesen - nur root Würfel x anstatt in [0, x+1) alles zu testen. Kein Grund, in diesem Fall eine Schleife zu machen.

x = int(input("Enter an integer: ")) 
result = x ** (1/3) 
if result == int(result): 
    print("Cube root of", x, "is", result) 
else: 
    print(x, "is not a perfect cube") 
+1

Dies funktioniert nicht für 9796532 * *3. 1/3 hat keine schöne Binärdarstellung, daher gibt es Rundungsfehler. – Scott

+1

Sie könnten sowohl Boden und Cieling versuchen. Die Rundungsfehler werden nie so groß sein wie – Scott

+0

@Scott, die Sie durch mögliche Lösungen um 'Ergebnis' aufzählen könnten, aber das Arbeiten mit großen Zahlen verursacht schließlich Gleitkomma-Probleme, die nichts mit Ihrer Implementierung zu tun haben. Wenn Sie eine Lösung für große Zahlen erwarten, müssen Sie sich dessen bewusst sein. –

1

Statt durch eine Menge von ganzen Zahlen von Iterieren, nehmen Sie nur die Kubikwurzel Ihrer Eingabe und prüfen, ob es sich um eine ganze Zahl ist.

so etwas wie folgt aus:

root = x**(1.0/3.0) return root.is_integer()

+0

Das gleiche Problem hier.Dies funktioniert nicht für root = 9796532 ** 3. 1/3 hat keine schöne Binärdarstellung, so dass es Rundungsfehler gibt – Scott

+0

mit numpy sollte einige dieser Fehler loswerden. Außerdem bin ich eine Hausaufgabenfrage. –

0

answer=None cube_root_found=False

Wir tun dies, weil, wenn x 0 ist, wird die für Schleifen 0 mal auszuführen. In diesem Fall ohne den obigen Code, werden wir nie Wert auf diese Variablen und

if not cube_root_found:

fehl mit "NameError: name 'cube_root_found' is not defined Nachricht zuweisen.

0

Neben der Verwendung von Pause, würde ich vorschlagen Bereich abs Begrenzung (x)/2 - es sei denn, es ist entweder -1, 0 oder 1.

Außerdem bin ich nicht sicher, ob Python optimieren Aufruf abs bei jedem Zyklus auf dem gleichen Wert - höchstwahrscheinlich nicht, so würde ich pre-store abs (x)

abs_x = abs(x) 
upper_limit = 2 if abs_x < 2 else abs_x/2 
for i in range(upper_limit): 
    if i**3 == abs_x: 
...... 
0

prüft wird, ob int(n**(1./3)) == n**(1./3) der Regel nicht funktioniert, si nce 1/3 repräsentiert nicht gut im Binärformat. versuchen abs(int(n**(1./3)) == n**(1./3)) < 0.000000000001

Überprüfung innerhalb einer Schwelle ist eine normale Möglichkeit, um bei Rundungsfehlern auf Gleichheit zu prüfen. Man beachte, dass (n + 1) ** (1/3) -> n ** (1/3) als n groß wird, so dass dies für sehr, sehr, sehr große n falsche Ergebnisse liefert.

Verwandte Themen