2015-01-18 17 views
13

Oto jak to jest najlepszy sposób, znalazłem:Jak znaleźć rdzeń kostki za pomocą języka Python?

x = int(raw_input("Enter an integer: ")) 
for ans in range(0, abs(x) + 1): 
    if ans ** 3 == abs(x): 
     break 
if ans ** 3 != abs(x): 
    print x, 'is not a perfect cube!' 
else: 
    if x < 0: 
     ans = -ans 
    print 'Cube root of ' + str(x) + ' is ' + str(ans) 

Czy istnieje lepszy sposób, najlepiej taki, który unika konieczności iteracyjne nad wartościami kandydujących?

+0

Czy chcesz wyjaśnić, jakie jest Twoje * pytanie *? W tej chwili nie wydaje się, aby ... –

+0

Był wystarczająco jasny, nie jestem pewien, jak może powstać zamieszanie – oisinvg2001

Odpowiedz

15

Najlepszym sposobem jest użycie prosta matematyka

>>> a = 8 
>>> a**(1./3.) 
2.0 

EDIT

dla liczb ujemnych

>>> a = -8 
>>> -(-a)**(1./3.) 
-2.0 

kompletny program dla wszystkich wymagań określonych

x = int(input("Enter an integer: ")) 
if x>0: 
    ans = x**(1./3.) 
    if ans ** 3 != abs(x): 
     print x, 'is not a perfect cube!' 
else: 
    ans = -((-x)**(1./3.)) 
    if ans ** 3 != -abs(x): 
     print x, 'is not a perfect cube!' 

print 'Cube root of ' + str(x) + ' is ' + str(ans) 
+0

Da on dziwne wyjście, jeśli na przykład "a = -8". Numery kopalni dają kompleksowe wyniki liczbowe. Co to jest pierwiastek kostki z -8 = -2. Tutaj wynik: '(1.0000000000000002 + 1.7320508075688772j)'. To skomplikowana liczba. –

+0

@BhargavRao lol dlaczego używasz dwóch '-'? Odwraca to z powrotem. Podstawowym rdzeniem kostki -8' jest '-2'. Ale twoja droga wyjścia to '(1.0000000000000002 + 1.7320508075688772j)' –

+0

@kmn Hej Dostaję wyjście poprawnie .. –

19

Można użyć x ** (1./3) do obliczenia korzenia kostki (zmiennoprzecinkowe) z x.

Nieznaczny subtelność tutaj jest to, że działa inaczej dla liczb ujemnych w Pythonie 2 i 3. następujący kod jednak, że uchwyty:

def is_perfect_cube(x): 
    x = abs(x) 
    return int(round(x ** (1./3))) ** 3 == x 

print(is_perfect_cube(63)) 
print(is_perfect_cube(64)) 
print(is_perfect_cube(65)) 
print(is_perfect_cube(-63)) 
print(is_perfect_cube(-64)) 
print(is_perfect_cube(-65)) 
print(is_perfect_cube(2146689000)) # no other currently posted solution 
            # handles this correctly 

Dzieje pierwiastek sześcienny z x, zaokrągla się do najbliższa liczba całkowita, podnosi do trzeciej potęgi, a na końcu sprawdza, czy wynik jest równy x.

Powodem przyjęcia bezwzględnej wartości jest sprawienie, aby kod działał poprawnie dla liczb ujemnych w różnych wersjach Pythona (Python 2 i 3 traktują zwiększanie liczb ujemnych do mocy ułamkowych w inny sposób).

+0

Pytanie oznaczone pythonem 3.x tak nie potrzebne – M4rtini

+0

Nie powinno być potrzeby "okrągłego" – PascalVKooten

+0

@PascalvKooten: Jaka jest proponowana alternatywa? Po prostu 'int()'? – NPE

4
def cube(x): 
    if 0<=x: return x**(1./3.) 
    return -(-x)**(1./3.) 
print (cube(8)) 
print (cube(-8)) 

Oto pełna odpowiedź dla liczb ujemnych i dodatnich.

>>> 
2.0 
-2.0 
>>> 

Albo tutaj jest jeden liniowiec;

root_cube = lambda x: x**(1./3.) if 0<=x else -(-x)**(1./3.) 
Powiązane problemy