숫자의 제곱근을 계산하십시오.


12

이 코드 골프의 목표는 입력으로 주어진 숫자의 제곱근을 계산하고 출력하는 프로그램 또는 함수를 만드는 것입니다.
규칙:

  • 외부 자원이 없음
  • 내장 큐브 루트 기능을 사용하지 않습니다.
  • 숫자를 거듭 제곱 할 수있는 방법 / 연산자 (제곱근, 제 4 근 등 포함)를 사용하지 않습니다.
  • 함수 / 프로그램은 부동 소수점 숫자와 음수를 입력으로 받아 들일 수 있어야합니다.
  • 큐브 근이 부동 소수점 숫자 인 경우 소수점 다음 4 자리로 반올림합니다.
  • 이것은 바이트 단위의 가장 짧은 코드가이기는 코드 골프입니다.

테스트 사례 :

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

위의 모든 테스트 사례를 사용하여 음수 ( -27 --> -3, -64 --> -4...) 를 테스트 할 수 있습니다.


젠장, 당신이 정확한 큐브와 숫자 만 허용한다면, 나는 좋은 골프를해야합니다
요 '

1
귀하의 테스트 사례로 판단하면 프로그램이 실수 만 처리해야한다고 생각합니까?
user12205

@ace는 복잡한 것을 추가하고 코드에서 두 글자를 변경합니다.)
yo '

2
소수점 다음 4 자리로 반올림하는 것이 강력한 요구 사항입니까? 아니면 "소수점 뒤에 4 자리 이상을 표시 할 필요가 없습니다"와 같은 것일 수 있습니까?
Victor Stafusa

Exp (ln (x) / 3) (및 여러 복제본)를 사용하는 내 대답과 관련하여 Exp가 허용되는지 확인하십시오. 나는 pow (x, 1 / 3)가 (기술적으로 큐브 루트 함수는 아니지만) 그렇지 않다고 가정합니다.
Level River St

답변:


6

J : 16 자

Haskell 답변의 느슨한 번역 :

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

테스트 사례 :

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

다음과 같이 작동합니다.

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

한마디로 :

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

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

~끝 이 뾰족한 포크와 오른쪽 이 있기 때문에 최고의 단어 번역이 아닙니다 .


19

하스켈-35

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

예제 실행 :

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

또한 import하면 Data.Complex복잡한 숫자에서도 작동하며 숫자의 근 중 하나를 반환합니다 (3 개가 있음).

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

:+연산자로 읽어야한다 '플러스 나는 배'


1
+1이 필요합니다. 지난 1 시간 동안 일반화 된 n 번째 루트 알고리즘을 리팩토링했으며, 이제 동일한 결과에 도달했습니다. 브라보.
primo

@primo 나는 즉시 n 번째 근사 알고리즘을 모두 회상했으며 APL의 Taylor / Maclaurin 시리즈를 포기한 후에 이것을 사용했습니다.
nini

내가 얻은 Newton 방법을 사용하면 x=(2*x+n/x/x)/3왜 사용할 수 있는지 설명 할 수 x=(x+n/x/x)/2있습니까? 느리게 수렴하지만 왜 수렴하는지 설명 할 수 없습니다 ...
Michael M.

@Michael 당신이 가지고가는 경우 때문에 x=cbrt(n), 다음 x=(x+n/x/x)/2사실이다. 당신의 표현에 대해서도 마찬가지입니다
mniip

@Michael 나는 이런 식으로 거기에 도착했다 : codepad.org/gwMWniZB
primo

7

SageMath, (69) 62 바이트

그러나 그것이 결과를 줄 것이라고 믿지 마십시오. 모든 숫자를 무작위로 처리하는 것은 매우 어렵습니다.

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

잘림을 주장하지 않은 경우 :

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

SageMath, 12 바이트 ( exp허용되는 경우 )

긍정, 부정, 제로, 복잡한 ...

exp(ln(x)/3)

숫자를 거듭 제곱 할 수있는 연산자를 사용하고 있다고 생각합니다.
user12205

아 좋아, 오른쪽, 편집
yo '

6
여전히 요구 사항을 충족시키는 기념비적 인 멍청한 알고리즘의 경우 +1입니다.
기계 달팽이

@Mechanicalsnail 감사합니다. 나는 내가하는 일이 일종의 불황이라는 것이 명백해지기를 바란다. D 그러나, 만약 exp허용 된다면 , 나는 12 세 이하로 멍청하지 않다. :)
yo '

그것을 고려하면 exp"값이 함수는 상수 E 인 인수의 거듭 제곱 정수, 특히 함수이다."는 "지수 함수"의 약자 및 방법 / 운영자 소용 "없다고 숫자를 거듭 제곱 할 수 있습니다 " exp는 허용되지 않습니다.
mbomb007

5

파이썬-62 바이트

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

완전 부동 소수점 정밀도로 평가합니다. 사용 된 방법은 Halley 's method 입니다. 각 반복이 마지막 숫자보다 3 배 많은 올바른 자릿수를 생성하므로 99 개의 반복은 약간 과잉입니다.

입출력:

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

어떻게 작동합니까?
justhalf

1
@ justhalf 나는 이것이 뉴턴의 근사법이라고 생각합니다.
yo '

Btw, 실패0
yo '

에 실패했습니다 -2. 죄송합니다.
yo '

3
@plg 문제 설명은 지수 함수의 사용을 금지합니다. 그렇지 않으면 v**(1/.3)확실한 승자가 될 것입니다.
primo

3

자바 스크립트 (55)

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

보너스, 모든 뿌리에 대한 일반 제형
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

큐브 루트, 바로 사용하기 위해 f(n,3), 제곱근 f(n,2):, 등등 ... 예 f(1024,10)돌아갑니다 2.

설명
뉴턴 방법을 기반으로 :

찾기 : f(x) = x^3 - n = 0해결책은 n = x^3
파생입니다.f'(x) = 3*x^2

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

테스트

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

한 글자 더 짧은 :function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
복사

47 바이트로 줄일 수 있음f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
Luis felipe De jesus Munoz

2

PHP-81 바이트

반복 솔루션 :

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

제곱근 제곱을 계산하려고하면 어떻게됩니까?
Victor Stafusa

"0"만 출력됩니다 (오류 억제 연산자 덕분에 "@").
Razvan

1
0.0001로 대체 될 수 1e-40.00001의해 1e.5.
ComFreek

PHP <7이 필요합니다 ( PHP 7에서 0/0제공 NAN). $i=0;불필요합니다 (-5 바이트. 그렇지 않은 경우 for1 바이트를 저장합니다). 공백 print은 필요하지 않습니다 (-1 바이트). -R로 3 바이트를 절약 할 수 있습니다 $argn.
Titus

한 쌍의 패러 틴을 while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 바이트)로 저장하십시오 .
Titus

2

펄, 92 바이트

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • 이 함수 a는 불필요한 분수 부분이나 오른쪽 끝에 의미없는 0이없는 숫자가있는 문자열을 반환합니다.

결과:

              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

에 의해 생성 된

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;

계산은 뉴턴의 방법을 기반으로합니다 .

계산


2

APL-31

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

cbrt(x)=e^(ln(x)/3)순진한 지수화 대신 e^x테일러 / 매 클라 우린 계열을 사용하여 계산 한다는 사실을 사용합니다 .

샘플 실행 :

⎕: 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 자로 된 J 답변 이 있다는 것을 알면 APL에서 정말 끔찍해야합니다 ...


2

자바 207 182 181

때로 골프를 타면 맥주가 두 개나 많아서 정말 나빠요

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

반복적 인 Newton의 근사법은 99 회 반복됩니다.

여기 골프가 없습니다 :

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
args변수 이름을로 바꾸면 z6자가 줄어 듭니다. for- 루프의 몸체에서 공간과 중괄호를 제거하여 3자를 줄일 수 있습니다. 당신은 대체 할 수 10000.0에 의해 1e46 개 문자를 감소. 수업은 공개 할 필요가 없으므로 7자를 더 줄일 수 있습니다. 이렇게하면 185 자로 줄어 듭니다.
Victor Stafusa

마지막에 캐스트가 정말로 필요한가요? 그것은 나를 위해하지 않습니다.
Victor Stafusa

@Victor 좋은 눈으로 감사합니다. 10000.0 double에 E 표기법을 사용하는 것은 대단히 좋은 생각이었습니다. 질문의 디자인에 따르면,이 기능을 cli 클래스 대신 메소드로 만드는 것이 합법적이라고 생각합니다.이 클래스는 크기를 상당히 줄입니다. Java를 사용하면 기회가 없다고 생각하여 기능 측면에서 잘못되었습니다.
md_rasler

CodeGolf에 오신 것을 환영합니다! 이것이 어떻게 작동하는지에 대한 해답을 추가하는 것을 잊지 마십시오!
저스틴

@Quincunx, 감사합니다. 권장 사항을 변경했습니다.
md_rasler

2

TI 기본, 26 24 바이트

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

그것은 ^연산자를 직접 사용 하지 않습니다. 그것은 규칙에 의해 금지되어 있습니다
mniip

@ mniip : e^TI-83 시리즈의 단일 연산자입니까? 기억이 안나요 어느 쪽이든, 그것은 규칙의 정신을 위반하고 있습니다.
기계 달팽이

@Mechanicalsnail 내가 말할 것이 중요하지 않습니다. 대부분의 언어에서 당신은 할 수 exp(ln(x)/3)또는 e^(ln(x/3))당신은이 두 가지 중 하나를 허용합니다. 그러나 어쨌든 나는 규칙에 의해 허용되는 것 exp(ln(x)/a)보다 너무 많은 것을 이해합니다 x^(1/a):-/
yo '

지수 함수 "값이 함수는 상수 인수의 제곱 상수 전자이고, 특히 함수." ... "수를 거듭 제곱 할 수있는 방법 / 연산자를 사용하지 마십시오"
mbomb007

catch @ mbomb007에 감사드립니다. 나는 3 년 전에이 답변을 썼으며,이를 준수하도록 수정하겠습니다.
Timtech

2

JS 57 바이트

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

자바 스크립트 : 73/72 자

이 알고리즘은 부적절하며이 질문은 소수점 다음 4 자리로 제한된다는 사실을 이용합니다. 그것은 질문을 재 작업하기 위해 샌드 박스에서 제안한 알고리즘의 수정 된 버전입니다. h*h*h<a4 자리 10 진수를 처리하는 곱셈과 나눗셈을 사용하여 0에서 무한까지 계산합니다 .

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

4 년 후 편집 : Luis felipe De jesus Munoz가 제안한대로 **코드 를 사용 하면 코드가 짧아 지지만이 답변을 쓴 2014 년에는이 기능을 사용할 수 없었습니다. 어쨌든 그것을 사용함으로써 우리는 여분의 캐릭터를 면도합니다.

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

1
대신 h*h*h당신이 할 수있는 h**31 바이트 저장
루이스 펠리페 드 예수님 무 노즈

@LuisfelipeDejesusMunoz이 답변은 2014 년입니다.이 **연산자는 2015 년에 제안되었으며 2016 년에 ECMAScript 7의 일부로 승인되었습니다 **.
Victor Stafusa

1

자바 스크립트-157 자

이 기능 :

  • 음수를 처리하십시오.
  • 부동 소수점 숫자를 처리하십시오.
  • 모든 입력 번호에 대해 신속하게 실행하십시오.
  • 자바 스크립트 부동 소수점 숫자에 허용되는 최대 정밀도를 갖습니다.
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}

Ungolfed 설명 버전 :

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

뉴턴의 방법을 기반으로합니다. 마이클의 대답의 약간 수정 된 버전 :

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

음수와 함께 작동하고 부동 소수점 숫자를 처리 할 수 ​​있으며 결과가 부동 소수점 숫자 인 경우 결과를 소수점 뒤 4 개의 숫자로 반올림합니다.

실무 데모


을 사용하여 2 바이트를 저장할 수 있습니다 for($x=1;++$i<100;).... 그러나 사전 정의 된 변수를 입력으로 사용하는 것은 일반적으로 눈살을 찌푸 립니다. 더 나은 사용 $argv[1]또는 $argn.
Titus

1

Befunge 98-진행중인 작업

이 언어는 부동 소수점 숫자를 지원하지 않습니다. 이것은 그들을 모방하려고 시도합니다. 현재 0소수점 이후로 시작하지 않는 양수 (대부분)에서 작동합니다. 그러나 소수점 이하 2 자리 만 출력합니다.

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

소수점 앞 부분을 입력하고을 곱한 100000다음 점 다음 부분을 입력하고 두 숫자를 더하여 작동합니다. 두 번째 줄은 큐브가 입력 된 숫자보다 클 때까지 카운터를 수행합니다. 그런 다음 세 번째 줄은 정수에서 10 진수를 추출합니다.

누구든지 왜 세 번째 줄 100이 올바른 값을 얻기 위해 나누는 지 말해 줄 수 있다면 알려주십시오.

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

스몰 토크, 37

크레디트는 알고리즘에 대한 니파이로 간다. 그의 코드의 스몰 토크 버전 :

n의 입력; x로 출력 :

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

또는, 블록으로

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

1

게임 메이커 언어, 51 바이트

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

0

하스켈 : 99C

영리하게 @mniip을 이길 수 없습니다. 방금 이진 검색을 했어요.

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

언 골프 드 :

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

d(와 같은 (l#h)x)에 대해 중위 연산자를 사용하여 각 호출에 대한 바이트를 저장할 수 있습니다 . c다음이됩니다 id>>=(0#).
Esolanging Fruit

주변의 공백을 제거 할 수 있습니다 c < x.
Esolanging Fruit

1>0대신 사용할 수 있습니다 True.
Esolanging Fruit

0

J 28

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

Newtons 방법을 사용 x^3 - X하여 업데이트 단계 의 근본을 찾는 x - (x^3 - C)/(3*x^2)위치는 여기서 x는 현재 추측이고 C는 입력입니다. 이것에 대한 수학을하는 것은 우스꽝스럽게 간단한 표현을 산출합니다 (2*x+C/x^2) /3. 음수에주의를 기울여야합니다.

J에서 오른쪽에서 왼쪽으로 구현되었습니다.

  1. | 두 가지 주장을 모두 취하지 않고 전달하십시오.
  2. ^:_ 수렴까지
  3. (%*~@])C / x^2( *~ y와 동일 y * y)
  4. +:@] 이다 2 x
  5. 3%~3으로 나눕니다. 이것은 긍정적 인 뿌리를 산출
  6. *@[ * positive_root 양의 근에 C의 부호를 곱합니다.

시운전 :

   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 바이트

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

사용법 예 :

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

JavaScript이것이 유래 한 솔루션 에 대해서는 @Mig에게 감사드립니다 . for루프가 변경을 중지하기 위해 반복이 필요 하다는 점을 감안하면 놀랍게도 빠르게 실행됩니다 .




0

자바 솔루션

공개 BigDecimal cubeRoot (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
PPCG에 오신 것을 환영합니다! 이것은 코드 골프 챌린지입니다. 즉, 가능한 한 적은 코드 (소스 파일의 바이트 단위로 계산)를 해결하는 것이 목표입니다. 해당 목표에 맞게 솔루션을 최적화하기위한 노력을 보여주고 바이트 수를 답에 포함시켜야합니다.
마틴 엔더

0

파이썬 솔루션

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.