Calcola la radice del cubo di un numero


12

L'obiettivo di questo codice golf è creare un programma o una funzione che calcoli e produca la radice del cubo di un numero che viene fornito come input.
Le regole:

  • Nessuna risorsa esterna
  • Nessun uso delle funzioni di root del cubo integrate.
  • Nessun uso di metodi / operatori che possono elevare un numero a una potenza (che include radice quadrata, 4a radice, ecc.).
  • La funzione / programma deve essere in grado di accettare numeri in virgola mobile e numeri negativi come input.
  • Se la radice del cubo è un numero in virgola mobile, arrotondarlo a 4 numeri dopo il punto decimale.
  • Questo è un codice golf, vince il codice più breve in byte.

Casi test:

27 --> 3
64 --> 4
1  --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7  --> 1.9129

Puoi utilizzare tutti i casi di test sopra riportati per testare numeri negativi ( -27 --> -3, -64 --> -4...)


accidenti, se permettessi solo numeri con cubo preciso, avrei un bel golf
yo

1
A giudicare dai tuoi casi di test, suppongo che il programma debba occuparsi solo di numeri reali?
user12205

@ace aggiunge il complesso e cambio 2 lettere nel mio codice;)
yo

2
L'arrotondamento a 4 cifre dopo la virgola è un requisito forte? O potrebbe essere qualcosa del tipo "non è necessario mostrare più di 4 cifre dopo il punto decimale"?
Victor Stafusa,

Con riferimento alla mia risposta usando Exp (ln (x) / 3) (e diversi cloni), si prega di chiarire se Exp è permesso. Suppongo che pow (x, 1/3) non lo sia (anche se tecnicamente non è una funzione root cubo).
Level River St

Risposte:


6

J: 16 caratteri

Traduzione libera della risposta di Haskell:

-:@((%*~)+])^:_~

Casi test:

   -:@((%*~)+])^:_~27
3
   -:@((%*~)+])^:_~64
4
   -:@((%*~)+])^:_~1
1
   -:@((%*~)+])^:_~18.609625
2.65
   -:@((%*~)+])^:_~3652264
154
   -:@((%*~)+])^:_~0.001
0.1
   -:@((%*~)+])^:_~7
1.91293

Funziona così:

     (-:@((% *~) + ])^:_)~ 27
↔ 27 (-:@((% *~) + ])^:_) 27
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 27
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 27 * 27) + 27)
↔ 27 (-:@((% *~) + ])^:_) 13.5185
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 13.5185
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 13.5185 * 13.5185) + 13.5185)
↔ 27 (-:@((% *~) + ])^:_) 6.83313
...

In parole:

half =. -:
of =. @
divideBy =. %
times =. *
add =. +
right =. ]
iterate =. ^:
infinite =. _
fixpoint =. iterate infinite
by_self =. ~

-:@((%*~)+])^:_~ ↔ half of ((divideBy times by_self) add right) fixpoint by_self

Non è una delle migliori traduzioni prolisse, dal momento che c'è una forcella diadica e un ~diritto alla fine.


19

Haskell - 35

c n=(iterate(\x->(x+n/x/x)/2)n)!!99

Esempi di esecuzione:

c 27  =>  3.0
c 64  =>  4.0
c 1  =>  1.0
c 18.609625  =>  2.6500000000000004  # only first 4 digits are important, right?
c 3652264  =>  154.0
c 0.001  =>  0.1
c 7  =>  1.9129311827723892
c (-27)  =>  -3.0
c (-64)  =>  -4.0

Inoltre, se importi Data.Complex, funziona anche su numeri complessi, restituisce una delle radici del numero (ce ne sono 3):

c (18:+26)  =>  3.0 :+ 1.0

L' :+operatore deve essere letto come "più i volte"


1
Questo merita un +1. Nell'ultima ora ho refactoring dell'nth alg general root, e proprio ora sono arrivato allo stesso risultato. Bravo.
primo

@primo Ho immediatamente ricordato tutti gli ennesimi algoritmi di approssimazione della radice, e dopo aver rinunciato alla serie Taylor / Maclaurin in APL l'ho usato.
mniip,

Usando il metodo Newton che ho ottenuto x=(2*x+n/x/x)/3, puoi spiegare perché puoi usare x=(x+n/x/x)/2? Converge più lentamente ma non riesco a spiegare perché converge ...
Michael M.

@Michael perché se lo prendi x=cbrt(n), allora x=(x+n/x/x)/2è vero. Quindi è vero per la tua espressione
mniip

@Michael ci sono arrivato così: codepad.org/gwMWniZB
primo

7

SageMath, (69) 62 byte

Tuttavia, non credere mai che ti darà il risultato, è molto difficile passare in rassegna tutti i numeri in modo casuale:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return "%.4f"%y

se non hai insistito per troncare:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return y

SageMath, 12 byte, se expconsentito

Funziona per tutte le cose: positivo, negativo, zero, complesso, ...

exp(ln(x)/3)

Credo che tu stia utilizzando un operatore che può elevare un numero a una potenza.
user12205

ah ok, giusto, modificato
yo

6
+1 per un algoritmo monumentalmente stupido che soddisfa ancora i requisiti.
Lumaca meccanica,

@Mechanicalsnail Grazie. Spero sia ovvio che quello che faccio è una sorta di recessione: D Comunque, se expè permesso, sono giù a 12 e non sono affatto stupido :)
yo

Considerando che expè l'abbreviazione di "funzione esponenziale", che è "una funzione il cui valore è una costante elevata alla potenza dell'argomento, in particolare la funzione in cui la costante è e.", E non vi è "Nessun uso di metodi / operatori che può aumentare un numero a una potenza ", expnon è consentito.
mbomb007,

5

Python - 62 byte

x=v=input()
exec"x*=(2.*v+x*x*x)/(v+2*x*x*x or 1);"*99;print x

Valuta con precisione a virgola mobile. Il metodo utilizzato è il metodo di Halley . Poiché ogni iterazione produce 3 volte il numero di cifre corrette dell'ultima, 99 iterazioni sono un po 'eccessive.

Input Output:

27 -> 3.0
64 -> 4.0
1 -> 1.0
18.609625 -> 2.65
3652264 -> 154.0
0.001 -> 0.1
7 -> 1.91293118277
0 -> 1.57772181044e-30
-2 -> -1.25992104989

Come funziona?
solo il

1
@justhalf Penso che questo sia sostanzialmente il metodo di approssimazione di Newton.
giovedì

A proposito, fallisce0
yo

Non ci riesci -2, scusa per quello.
giovedì

3
@plg La descrizione del problema proibisce l'uso di qualsiasi funzione esponenziale, altrimenti v**(1/.3)sarebbe un vincitore sicuro.
primo

3

Javascript (55)

function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}

BONUS, formulazione generale per tutte le radici
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

Per radice cubica, basta usare f(n,3), radice quadrata f(n,2), ecc ... Esempio: f(1024,10)restituisce 2.

Spiegazione
basata sul metodo Newton:

Trova:, f(x) = x^3 - n = 0la soluzione è n = x^3
La derivazione:f'(x) = 3*x^2

Iterate:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2

test

[27,64,1,18.609625,3652264,0.001,7].forEach(function(n){console.log(n + ' (' + -n + ') => ' + f(n) + ' ('+ f(-n) +')')})

27 (-27) => 3 (-3)
64 (-64) => 4 (-4)
1 (-1) => 1 (-1)
18.609625 (-18.609625) => 2.65 (-2.65)
3652264 (-3652264) => 154 (-154)
0.001 (-0.001) => 0.09999999999999999 (-0.09999999999999999)
7 (-7) => 1.912931182772389 (-1.912931182772389) 

Un personaggio più corto:function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
copia il

Può essere ridotto a 47 bytef=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
Luis felipe De jesus Munoz

2

PHP - 81 byte

Soluzione iterativa:

$i=0;while(($y=abs($x=$argv[1]))-$i*$i*$i>1e-4)$i+=1e-5;@print $y/$x*round($i,4);

Cosa succede se tenta di calcolare la radice del cubo pari a zero?
Victor Stafusa,

Emetterà semplicemente "0" (grazie all'operatore di soppressione degli errori - "@").
Razvan,

1
0.0001può essere sostituito da 1e-4e 0.00001da 1e.5.
ComFreek,

Ciò richiede PHP <7 ( 0/0fornisce NANin PHP 7). $i=0;non è necessario (-5 byte. Se non lo fosse, forrisparmierebbe un byte.) Lo spazio dopo printnon è richiesto (-1 byte). -Rpuò salvare 3 byte con $argn.
Tito

Salvare una coppia di parentesi con while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 byte).
Tito

2

Perl, 92 byte

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • La funzione arestituisce una stringa con il numero senza una parte di frazione non necessaria o zero insignificanti all'estremità destra.

Risultato:

              27 --> 3
             -27 --> -3
              64 --> 4
             -64 --> -4
               1 --> 1
              -1 --> -1
       18.609625 --> 2.65
      -18.609625 --> -2.65
         3652264 --> 154
        -3652264 --> -154
           0.001 --> 0.1
          -0.001 --> -0.1
               7 --> 1.9129
              -7 --> -1.9129
 0.0000000000002 --> 0.0001
-0.0000000000002 --> -0.0001
               0 --> 0
              -0 --> 0

Generato da

sub test{
    my $a = shift;
    printf "%16s --> %s\n", $a, a($a);
    printf "%16s --> %s\n", "-$a", a(-$a);
}
test 27;
test 64;
test 1;
test 18.609625;
test 3652264;
test 0.001;
test 7;
test "0.0000000000002";
test 0;

Il calcolo si basa sul metodo di Newton :

Calcolo


2

APL - 31

(×X)×+/1,(×\99⍴(⍟|X←⎕)÷3)÷×\⍳99

Usa il fatto che cbrt(x)=e^(ln(x)/3), invece di fare esponenziali ingenui , calcola e^xusando la serie Taylor / Maclaurin.

Esecuzioni campione:

⎕: 27
3
⎕: 64
4
⎕: 1
1
⎕: 18.609625
2.65
⎕: 3652264
154
⎕: 0.001
0.1
⎕: 7
1.912931183
⎕: ¯27
¯3
⎕: ¯7
¯1.912931183

Visto che c'è una risposta J in 16 caratteri, devo essere davvero terribile in APL ...


2

Java, 207 182 181

A volte quando gioco a golf ho due molte birre e gioco davvero male

class n{public static void main(String[]a){double d=Double.valueOf(a[0]);double i=d;for(int j=0;j<99;j++)i=(d/(i*i)+(2.0*i))/3.0;System.out.println((double)Math.round(i*1e4)/1e4);}}

Metodo di approssimazione iterativo di Newton, esegue 99 iterazioni.

Ecco l'UnGolfed:

class n{
    public static void main(String a[]){
        //assuming the input value is the first parameter of the input
        //arguments as a String, get the Double value of it
        double d=Double.valueOf(a[0]);
        //Newton's method needs a guess at a starting point for the 
        //iterative approximation, there are much better ways at 
        //going about this, but this is by far the simplest. Given
        //the nature of the problem, it should suffice fine with 99 iterations
        double i=d;

        //make successive better approximations, do it 99 times
        for(int j=0;j<99;j++){
            i=( (d/(i*i)) + (2.0*i) ) / 3.0;
        }
        //print out the answer to standard out
        //also need to round off the double to meet the requirements
        //of the problem.  Short and sweet method of rounding:
        System.out.println( (double)Math.round(i*10000.0) / 10000.0 );
    }
}

1
Puoi rinominare la argsvariabile in qualcosa del genere z, riducendo 6 caratteri. È possibile rimuovere lo spazio e le parentesi graffe nel corpo del for-loop, riducendo 3 caratteri. È possibile sostituire 10000.0con 1e4, riducendo di 6 caratteri. La classe non deve essere pubblica, quindi puoi ridurre di più 7 caratteri. In questo modo sarà ridotto a 185 caratteri.
Victor Stafusa,

Il cast alla fine è davvero necessario? Non per me
Victor Stafusa,

@Victor Grazie per l'occhio buono, l'uso della notazione E per il doppio 10000.0 è stata un'idea straordinariamente buona. Secondo la progettazione della domanda, penso che sia legittimo renderlo un metodo anziché una classe cli funzionante, che ridurrebbe notevolmente le dimensioni. Con Java, non pensavo di avere una possibilità, quindi ho sbagliato dal punto di vista funzionale.
md_rasler,

Benvenuto in CodeGolf! Non dimenticare di aggiungere una spiegazione in risposta a come funziona!
Giustino,

@Quincunx, grazie, ha apportato la modifica consigliata.
md_rasler,

2

TI-Basic, 26 24 byte

Input :1:For(I,1,9:2Ans/3+X/(3AnsAns:End

Questo utilizza direttamente l' ^operatore, vero? È vietato dalle regole
mniip

@mniip: e^è un singolo operatore della serie TI-83? Non ricordo. Ad ogni modo, sta violando lo spirito delle regole.
Lumaca meccanica,

@Mechanicalsnail Non importa, direi. Nella maggior parte delle lingue potresti semplicemente fare exp(ln(x)/3)o e^(ln(x/3))se permessi una di queste due. Ma in qualche modo capisco exp(ln(x)/a)come troppo equivalente per x^(1/a)essere consentito dalle regole: - /
yo '

Funzione esponenziale: "una funzione il cui valore è una costante elevata alla potenza dell'argomento , in particolare la funzione in cui la costante è e". ... "Nessun uso di metodi / operatori che possono elevare un numero a una potenza"
mbomb007,

Grazie per la cattura @ mbomb007, ho scritto questa risposta più di 3 anni fa e la riparerò per conformarmi ora.
Timtech,

2

Js 57 byte

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
document.getElementById('div').innerHTML += f(-27) + '<br>'
document.getElementById('div').innerHTML += f(-64) + '<br>'
document.getElementById('div').innerHTML += f(-1) + '<br>'
document.getElementById('div').innerHTML += f(-18.609625) + '<br>'
document.getElementById('div').innerHTML += f(-3652264) + '<br>'
document.getElementById('div').innerHTML += f(-0.001) + '<br>'
document.getElementById('div').innerHTML += f(-7) + '<br><hr>'
document.getElementById('div').innerHTML += f(27) + '<br>'
document.getElementById('div').innerHTML += f(64) + '<br>'
document.getElementById('div').innerHTML += f(1) + '<br>'
document.getElementById('div').innerHTML += f(18.609625) + '<br>'
document.getElementById('div').innerHTML += f(3652264) + '<br>'
document.getElementById('div').innerHTML += f(0.001) + '<br>'
document.getElementById('div').innerHTML += f(7) + '<br>'
<div id="div"></div>


2

Javascript: 73/72 caratteri

Questo algoritmo è scadente e sfrutta il fatto che questa domanda è limitata a 4 cifre dopo il punto decimale. È una versione modificata dell'algoritmo che ho suggerito nella sandbox allo scopo di rielaborare la domanda. Conta da zero all'infinito mentre h*h*h<a, solo con un trucco di moltiplicazione e divisione per gestire la pecision di 4 cifre decimali.

function g(a){if(a<0)return-g(-a);for(h=0;h*h*h<1e12*a;h++);return h/1e4}

Modifica, 4 anni dopo: Come suggerito da Luis Felipe De Jesus Munoz, usando **il codice è più breve, ma quella funzione non era disponibile nel 2014 quando ho scritto questa risposta. Ad ogni modo, usandolo, radiamo un personaggio in più:

function g(a){if(a<0)return-g(-a);for(h=0;h**3<1e12*a;h++);return h/1e4}

1
Invece h*h*hpuoi fare h**3e salvare 1 byte
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz Questa risposta è del 2014. L' **operatore è stato proposto nel 2015 ed è stato accettato come parte di ECMAScript 7 nel 2016. Quindi, al momento in cui l'ho scritto, non c'era **nella lingua.
Victor Stafusa,

1

Javascript - 157 caratteri

Questa funzione:

  • Gestisci numeri negativi.
  • Gestire numeri a virgola mobile.
  • Eseguire rapidamente per qualsiasi numero di input.
  • Ha la massima precisione consentita per i numeri in virgola mobile javascript.
function f(a){if(p=q=a<=1)return a<0?-f(-a):a==0|a==1?a:1/f(1/a);for(v=u=1;v*v*v<a;v*=2);while(u!=p|v!=q){p=u;q=v;k=(u+v)/2;if(k*k*k>a)v=k;else u=k}return u}

Versione spiegata non golfata:

function f(a) {
  if (p = q = a <= 1) return a < 0 ? -f(-a)      // if a < 0, it is the negative of the positive cube root.
                           : a == 0 | a == 1 ? a // if a is 0 or 1, its cube root is too.
                           : 1 / f (1 / a);      // if a < 1 (and a > 0) invert the number and return the inverse of the result.

  // Now, we only need to handle positive numbers > 1.

  // Start u and v with 1, and double v until it becomes a power of 2 greater than the given number.
  for (v = u = 1; v * v * v < a; v *= 2);

  // Bisects the u-v interval iteratively while u or v are changing, which means that we still did not reached the precision limit.
  // Use p and q to keep track of the last values of u and v so we are able to detect the change.
  while (u != p | v != q) {
    p = u;
    q = v;
    k = (u + v) / 2;
    if (k * k * k > a)
      v=k;
    else
      u=k
  }

  // At this point u <= cbrt(a) and v >= cbrt(a) and they are the closest that is possible to the true result that is possible using javascript-floating point precision.
  // If u == v then we have an exact cube root.
  // Return u because if u != v, u < cbrt(a), i.e. it is rounded towards zero.
  return u
}

1

PHP, 61

Basato sul metodo di Newton. Versione leggermente modificata della risposta di Michael :

for($i=$x=1;$i++<99;)$x=(2*$x+$n/$x/$x)/3;echo round($x,14);

Funziona con numeri negativi, può gestire numeri in virgola mobile e arrotonda il risultato a 4 numeri dopo il punto decimale se il risultato è un numero in virgola mobile.

Demo funzionante


È possibile salvare due byte con for($x=1;++$i<100;).... Ma l'utilizzo di variabili predefinite come input è generalmente disapprovato . Meglio usare $argv[1]o $argn.
Tito,

1

Befunge 98 - Lavori in corso

Questa lingua non supporta i numeri in virgola mobile; questo tenta di emularli. Attualmente funziona con numeri positivi che non iniziano 0dopo il punto decimale (principalmente). Tuttavia, genera solo 2 decimali.

&5ka5k*&+00pv
:::**00g`!jv>1+
/.'.,aa*%.@>1-:aa*

Funziona inserendo la parte prima del punto decimale, moltiplicandola per 100000, quindi inserendo la parte dopo il punto e sommando i due numeri. La seconda riga fa un contatore fino a quando il cubo è maggiore del numero immesso. Quindi la terza riga estrae il numero decimale dall'intero.

Se qualcuno può dirmi perché la terza riga si divide solo 100per ottenere i valori corretti, per favore dimmelo.

IO:

27.0       3 .0
64.0       4 .0
1.0        1 .0
18.609625  2 .65
0.001      0 .1
7.0        1 .91

0.1        0 .1

1

Smalltalk, 37

il credito va a mniip per l'algoritmo; Versione Smalltalk del suo codice:

input in n; uscita in x:

1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0]

o, come un blocco

[:n|1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0].x]

1

Lingua GameMaker, 51 byte

for(i=x=1;i++<99;1)x=(2*x+argument0/x/x)/3;return x

0

Haskell: 99C

Impossibile battere @mniip con intelligenza. Sono appena andato con una ricerca binaria.

c x=d 0 x x
d l h x
 |abs(x-c)<=t=m
 |c < x=d m h x
 |True=d l m x
 where m=(l+h)/2;c=m*m*m;t=1e-4

Ungolfed:

-- just calls the helper function below
cubeRoot x = cubeRoot' 0 x x

cubeRoot' lo hi x
    | abs(x-c) <= tol = mid           -- if our guess is within the tolerance, accept it
    | c < x = cubeRoot' mid hi x      -- shot too low, narrow our search space to upper end
    | otherwise = cubeRoot' lo mid x  -- shot too high, narrow search space to lower end
    where
        mid = (lo+hi)/2
        cubed = mid*mid*mid
        tol = 0.0001

È possibile utilizzare un operatore infix per d(mi piace (l#h)x) per salvare un byte per ogni chiamata. callora diventa id>>=(0#).
Esolanging Fruit

Puoi rimuovere gli spazi intorno c < x.
Esolanging Fruit

Puoi usare 1>0invece di True.
Esolanging Fruit

0

J 28

*@[*(3%~+:@]+(%*~@]))^:_&|&1

Utilizzando il metodo Newton, è possibile trovare la radice del x^3 - Xpassaggio di aggiornamento x - (x^3 - C)/(3*x^2), dove x è l'ipotesi corrente e C l'input. Fare matematica su questo produce l'espressione ridicolmente semplice di (2*x+C/x^2) /3. Bisogna fare attenzione ai numeri negativi.

Implementato in J, da destra a sinistra:

  1. | Prendi abs di entrambi gli argomenti, passali
  2. ^:_ Fallo fino alla convergenza
  3. (%*~@])è C / x^2( *~ yè equivalente a y * y)
  4. +:@] è 2 x
  5. 3%~dividere per tre. Questo produce la radice positiva
  6. *@[ * positive_root moltiplica la radice positiva con il signum di C.

Prova:

   NB. give it a name:
   c=: *@[*(3%~+:@]+(%*~@]))^:_&|&1
   c 27 64 1 18.609625 3652264 0.001 7
3 4 1 2.65 154 0.1 1.91293

0

AWK, 53 byte

{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}

Esempio di utilizzo:

$ awk '{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}' <<< 18.609625 
2.65$

Grazie a @Mig per la JavaScriptsoluzione da cui deriva. Funziona sorprendentemente rapidamente dato che il forloop richiede che l'iterazione smetta di cambiare.


0

C, 69 byte

i;float g(float x){for(float y=x;++i%999;x=x*2/3+y/3/x/x);return x;}

Solo un'altra implementazione del metodo di Newton. Provalo online!


0

Stax , 10 byte CP437

╘♀┘A╕äO¶∩'

Esegui ed esegui il debug online!

Spiegazione

Usa la versione decompressa per spiegare.

gpJux*_+h4je
gp              Iterate until a fixed point is found, output the fix point
  Ju            Inverse of square
    x*          Multiplied by input
      _+h       Average of the value computed by last command and the value at current iteration
         4je    Round to 4 decimal digits

0

Soluzione JAVA

public BigDecimal cubeRoot (numero BigDecimal) {

    if(number == null || number.intValue() == 0) return BigDecimal.ZERO;
    BigDecimal absNum = number.abs();
    BigDecimal t;
    BigDecimal root =  absNum.divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);


    do {

        t = root;
        root = root.multiply(BigDecimal.valueOf(2))
                .add(absNum.divide(root.multiply(root), MathContext.DECIMAL128))
                .divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);

    } while (t.toBigInteger().subtract(root.toBigInteger()).intValue() != 0);

    return root.multiply(number.divide(absNum), MathContext.DECIMAL128);
}

1
Benvenuti in PPCG! Questa è una sfida di code-golf , il che significa che l'obiettivo è quello di risolvere la sfida è il minor numero di codice possibile (conteggiato in byte del file sorgente). Dovresti mostrare alcuni sforzi per ottimizzare la tua soluzione verso quell'obiettivo e includere il conteggio dei byte nella tua risposta.
Martin Ender,

0

Soluzione Python

def cube_root(num):
    if num == 0:
        return 0

    t = 0
    absNum = abs(num)
    root = absNum/3

    while (t - root) != 0:
        t = root
        root = (1/3) * ((2 * root) + absNum/(root * root))

    return root * (num / absNum)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.