Bir sayının küp kökünü hesaplama


12

Bu kod golfünün amacı, girdi olarak verilen bir sayının küp kökünü hesaplayan ve çıkaran bir program veya işlev oluşturmaktır.
Kurallar:

  • Harici kaynak yok
  • Yerleşik küp kök işlevlerini kullanmaz.
  • Bir sayıyı bir güce (kare kök, 4. kök vb. İçeren) yükseltebilecek yöntem / işleçler kullanılmaz.
  • İşleviniz / programınız kayan noktalı sayıları ve negatif sayıları girdi olarak kabul edebilmelidir.
  • Küp kökü bir kayan noktalı sayı ise, ondalık noktadan sonra 4 sayıya yuvarlayın.
  • Bu bir kod golf, bayt en kısa kod kazanır.

Test senaryoları:

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

Negatif sayıları test etmek için yukarıdaki tüm test senaryolarını kullanabilirsiniz ( -27 --> -3, -64 --> -4...)


lanet olsun, sadece kesin küplü sayılara izin verirseniz, güzel bir golf
yo

1
Test durumlarınızdan yola çıkarak programın yalnızca gerçek sayılarla ilgilenmesi gerektiğini varsayıyorum?
user12205

@ace karmaşık ekleyin ve kodumdaki 2 harfi değiştiririm;)
yo

2
Ondalık noktadan sonra 4 basamağa yuvarlama güçlü bir gereksinim midir? Veya "ondalık noktadan sonra 4 basamaktan fazla göstermeniz gerekmez" gibi bir şey olabilir mi?
Victor Stafusa

Exp (ln (x) / 3) (ve bunun birkaç klonu) kullanarak cevabımla ilgili olarak, Exp'in izin verilip verilmediğini açıklayınız. Pow (x, 1/3) (teknik olarak bir küp kök işlevi olmasa bile) olmadığını varsayıyorum.
Level River St

Yanıtlar:


6

J: 16 karakter

Haskell cevabının gevşek çevirisi:

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

Test senaryoları:

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

Şöyle çalışır:

     (-:@((% *~) + ])^:_)~ 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
...

Kelimelerle:

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

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

En iyi kelime çevirilerinden biri değil, çünkü ikili bir çatal ve ~sonunda bir sağ var.


19

Haskell - 35

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

Örnek çalıştırmalar:

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

Dahası, içe aktarırsanız Data.Complex, karmaşık sayılar üzerinde bile çalışır, sayının köklerinden birini döndürür (3 vardır):

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

:+Operatör olarak okunması gereken 'artı ı kere'


1
Bu +1 değerini hak ediyor. Son saatte genelleştirilmiş n. Kök alglarını yeniden düzenledim ve şimdi de aynı sonuca vardım. Bravo.
primo

@primo Anında tüm n. kök yaklaşım algoritmalarını hatırladım ve APL'de Taylor / Maclaurin serisinden vazgeçtikten sonra bunu kullandım.
mniip

Newton metodunu kullanarak x=(2*x+n/x/x)/3neden kullanabileceğinizi açıklayabilir misiniz x=(x+n/x/x)/2? Yavaş yakınlaşıyor ama neden yakınsamasını açıklayamıyorum ...
Michael M.

@Michael çünkü alırsan x=cbrt(n), o x=(x+n/x/x)/2zaman doğrudur.
İfadeniz

@Michael Oraya bu şekilde geldim
primo

7

SageMath, (69) 62 bayt

Bununla birlikte, size sonucu vereceğine asla inanmayın, tüm sayılardan rastgele gitmek çok zor:

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

eğer kesme konusunda ısrar etmediyseniz:

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

SageMath, 12 bayt, expizin verilirse

Her şey için çalışır: pozitif, negatif, sıfır, karmaşık, ...

exp(ln(x)/3)

Bir sayıyı güce çıkarabilecek bir operatör kullandığınıza inanıyorum.
user12205

ah ok, right, edited
yo

6
Hala gereksinimleri karşılayan anıtsal bir aptal algoritma için +1.
Mekanik salyangoz

@Mechanicalsnail Teşekkürler. Umarım yaptığım şey bir tür durgunluktur: D Ancak, expizin verilirse, 12'ye
yo

Bunun exp"üstel fonksiyon" için kısa olduğu düşünüldüğünde , "değeri argümanın gücüne, özellikle de sabitin e olduğu fonksiyona yükseltilmiş bir fonksiyon olan bir fonksiyon" ve " bir sayıyı güce yükseltebilir ", expizin verilmez.
mbomb007

5

Python - 62 bayt

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

Tam kayar nokta hassasiyetini değerlendirir. Kullanılan yöntem Halley yöntemidir . Her yineleme sonuncunun 3 katı rakamı doğru ürettiğinden, 99 yineleme biraz fazladır.

Giriş çıkış:

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

Bu nasıl çalışıyor?
justhalf

1
@justhalf Bence bu temelde Newton'un yaklaştırma yöntemi.
yo'

Btw, başarısız0
yo

Başarısız, -2bunun için üzgünüm.
yo'

3
@plg Sorun açıklaması herhangi bir üstel işlevin kullanılmasını yasaklar, aksi takdirde v**(1/.3)kesin bir kazanan olur.
primo

3

Javascript (55)

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

BONUS, Tüm kökler için genel formülasyon
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

Küp kökü için, sadece kullanın f(n,3), kare kök f(n,2), vb ... Örnek: f(1024,10)döndürür 2.


Newton yöntemine göre açıklama :

Bul:, f(x) = x^3 - n = 0çözüm n = x^3
Türetme:f'(x) = 3*x^2

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

Testler

[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) 

Bir karakter daha kısa:function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
Kopya

47 bayta düşürülebilirf=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
Luis felipe De jesus Munoz

2

PHP - 81 bayt

Yinelemeli çözüm:

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

Sıfır küp kökünü hesaplamaya çalışırsa ne olur?
Victor Stafusa

Sadece "0" çıktısı verir (hata bastırma operatörü sayesinde - "@").
Razvan

1
0.0001ile değiştirilebilir 1e-4ve 0.00001tarafından 1e.5.
ComFreek

Bu PHP <7 gerektirir ( PHP 7'de 0/0verir NAN). $i=0;gereksizdir (-5 bayt. Eğer forolmasaydı , bir bayt tasarruf ederdi.) Sonraki boşluk printgerekli değildir (-1 bayt). -Rile 3 bayt kaydedebilir $argn.
Titus

while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 bayt) ile bir çift parantez kaydedin .
Titus

2

Perl, 92 bayt

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • İşlev a, gereksiz kesir kısmı olmayan numaraya veya sağ uçta önemsiz sıfırlara sahip bir dize döndürür.

Sonuç:

              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

Oluşturan

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;

Hesaplama Newton'un yöntemine dayanmaktadır :

Hesaplama


2

APL - 31

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

cbrt(x)=e^(ln(x)/3)Ancak, saf bir üs alma yerine e^xTaylor / Maclaurin serisini kullanarak hesapladığı gerçeğini kullanır .

Örnek çalışmalar:

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

16 karakterde bir J cevabı olduğunu görünce , APL'de gerçekten korkunç olmalıyım ...


2

Java, 207 182 181

Bazen golf oynadığımda iki biram var ve gerçekten çok kötü oynuyorum

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);}}

Yinelemeli Newton'un Yaklaşım Yöntemi, 99 yineleme çalıştırır.

İşte golf edilmemiş:

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
argsDeğişkeni z6 karakter azaltarak benzer bir adla yeniden adlandırabilirsiniz . 3 döngüyü azaltarak for-loop'un gövdesindeki alanı ve kıvırcık parantezleri kaldırabilirsiniz. Sen değiştirebilir 10000.0tarafından 1e46 karakter azaltarak. Sınıfın herkese açık olması gerekmez, bu nedenle daha fazla 7 karakter azaltabilirsiniz. Bu şekilde 185 karaktere düşürülecektir.
Victor Stafusa

Sondaki oyuncular gerçekten gerekli mi? Benim için değil.
Victor Stafusa

@Victor İyi göz için teşekkürler, 10000.0 duble için E notasyonu kullanımı muhteşem bir fikirdi. Sorunun tasarımı ile, bunu, büyük ölçüde küçülten, işleyen bir cli sınıfı yerine bir yöntem haline getirmenin yasal olduğunu düşünüyorum. Java ile bir şansım olduğunu düşünmedim, bu yüzden fonksiyonel tarafta hata yaptım.
md_rasler

CodeGolf'a hoş geldiniz! Bunun nasıl çalıştığına dair cevaplı bir açıklama eklemeyi unutmayın!
Justin

@Quincunx, Teşekkürler, önerilen değişikliği yaptı.
md_rasler

2

TI-Basic, 26 24 bayt

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

Bu doğrudan ^operatörü kullanır , öyle değil. Kurallar tarafından yasaklanmıştır
mniip

@mniip: e^TI-83 serisinde tek bir operatör var mı? Hatırlamıyorum. Her iki durumda da, kuralların ruhunu ihlal ediyor.
Mekanik salyangoz

@Mechanicalsnail Söylemem önemli değil. Çoğu dilde yapabilir exp(ln(x)/3)veya e^(ln(x/3))bu ikisinden herhangi birine izin verdiyseniz. Ama bir şekilde kurallara izin verilemeyecek exp(ln(x)/a)kadar eşdeğer olduğunu anlıyorum x^(1/a): - /
yo

Üstel işlev: "değeri sabitin argüman gücüne yükseltilen bir işlev , özellikle sabitin e olduğu işlev." ... "Bir sayı bir güce yükseltebilir yöntemleri / operatörleri kullanımı yok"
mbomb007

Catch @ mbomb007 için teşekkürler, bu cevabı 3 yıldan fazla bir süre önce yazdım ve şimdi uymak için düzelteceğim.
Timtech

2

JS 57 bayt

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 karakter

Bu algoritma topal ve bu sorunun ondalık noktadan sonraki 4 basamakla sınırlı olmasından faydalanıyor. Soruyu yeniden işleme koymak için sanal alanda önerdiğim algoritmanın değiştirilmiş bir sürümüdür. Sıfırdan sonsuzluğa kadar sayarken h*h*h<a, sadece 4 ondalık basamak hassasiyetini işlemek için bir çarpma ve bölme hilesi ile sayar.

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

Edit, 4 yıl sonra: Luis felipe De jesus Munoz tarafından önerildiği gibi **, kodu kullanarak daha kısadır, ancak bu özelliği 2014 yılında bu cevabı yazdığım zaman mevcut değildi. Her neyse, onu kullanarak ekstra bir karakter tıraş ediyoruz:

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

1
Bunun yerine 1 bayt h*h*hyapabilir h**3ve kaydedebilirsiniz
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz Bu cevap 2014'ten geliyor. **Operatör 2015 yılında önerildi ve 2016 yılında ECMAScript 7'nin bir parçası olarak kabul edildi **.
Victor Stafusa

1

Javascript - 157 karakter

Bu işlev:

  • Negatif sayıları kullanın.
  • Yüzen işaretli sayıları kullanın.
  • Herhangi bir giriş numarası için hızlı bir şekilde yürütün.
  • Javascript kayan noktalı sayıları için izin verilen maksimum hassasiyete sahiptir.
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}

Açıklanamayan sürüm:

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

Newton'un yöntemine göre. Michael'ın cevabının biraz değiştirilmiş versiyonu :

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

Negatif sayılarla çalışır, kayan nokta sayılarını işleyebilir ve sonuç bir kayan nokta sayısı ise ondalık noktadan sonra sonucu 4 sayıya yuvarlar.

Çalışma demosu


İle iki bayt kaydedebilirsiniz for($x=1;++$i<100;).... Ancak, önceden tanımlanmış değişkenlerin girdi olarak kullanılması genellikle kaşlarını çatar . Daha iyi kullanım $argv[1]veya $argn.
Titus

1

Befunge 98 - Yapım aşamasında

Bu dil kayan nokta sayılarını desteklemez; bu onları taklit etmeye çalışır. Şu anda 0ondalık noktadan sonra başlamayan pozitif sayılar için çalışır (çoğunlukla). Ancak, yalnızca 2 ondalık basamağa çıkar.

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

Ondalık noktadan önce parçayı girerek, bunu çarparak 100000, sonra noktadan sonra parçayı girerek ve iki sayıyı toplayarak çalışır. İkinci satır, küp girilen sayıdan daha büyük olana kadar bir sayaç yapar. Sonra üçüncü satır ondalık sayıyı tamsayıdan ayıklar.

Birisi bana üçüncü satırın neden sadece 100doğru değerleri elde etmek için bölündüğünü söyleyebilirse, lütfen söyle.

ES'ler:

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

kredi algoritma için mniip'e gider; Kodunun smalltalk versiyonu:

n olarak giriş; x cinsinden çıktı:

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

veya bir blok olarak

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

1

GameMaker Dili, 51 bayt

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

0

Haskell: 99C

Akıllıca mniip yenemezsin. Ben sadece bir ikili arama ile gittim.

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

Her çağrı için bir bayt kaydetmek üzere d(beğen (l#h)x) için bir infix operatörü kullanabilirsiniz . csonra olur id>>=(0#).
Esolanging Fruit

Etraftaki boşlukları kaldırabilirsiniz c < x.
Esolanging Fruit

Bunun 1>0yerine kullanabilirsiniz True.
Esolanging Fruit

0

J 28

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

Newton yöntemini kullanarak x^3 - X, güncelleme adımının kökünü bulmak x - (x^3 - C)/(3*x^2), burada x geçerli tahmin ve C girişi. Bu konuda matematik yapmak gülünç derecede basit bir ifade verir (2*x+C/x^2) /3. Negatif sayılara dikkat edilmelidir.

J'de sağdan sola uygulanır:

  1. | Her iki argümanın abslerini alın, aktar
  2. ^:_ Yakınsamaya kadar yapın
  3. (%*~@])eşittir C / x^2( *~ yeşittir y * y)
  4. +:@] dır-dir 2 x
  5. 3%~üçe böl. Bu pozitif kök verir
  6. *@[ * positive_root pozitif kökü C işareti ile çarpar.

Test sürüşü:

   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 bayt

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

Örnek kullanım:

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

JavaScriptBunun türetildiği çözüm için @Mig'e teşekkürler . forDöngünün değişmeyi durdurmak için yinelemeye ihtiyacı olduğu göz önüne alındığında şaşırtıcı bir şekilde hızlı bir şekilde çalışır .



0

Stax , 10 bayt CP437

╘♀┘A╕äO¶∩'

Çevrimiçi çalıştırın ve hata ayıklayın!

açıklama

Açıklamak için ambalajsız sürümü kullanır.

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

JAVA Çözümü

public BigDecimal cubeRoot (BigDecimal sayı) {

    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
PPCG'ye Hoşgeldiniz! Bu bir kod-golf meydan okuma, yani meydan okuma mümkün olduğunca az kod (kaynak dosyasının bayt cinsinden sayılır) çözmek anlamına gelir. Çözümünüzü bu hedefe göre optimize etmek için biraz çaba göstermeli ve yanıtınıza bayt sayısını eklemelisiniz.
Martin Ender

0

Python Çözümü

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.