어떤 수의 제곱근의 근사값은 x
정수 제곱근 복용하여 찾을 수 있습니다 s
(즉, 그러한 정수 최대 s * s ≤ x
)를 계산 한 후와 s + (x - s^2) / (2 * s)
. 이 근사를 호출하자 S(x)
. (참고 : 이것은 Newton-Raphson 방법의 한 단계를 적용하는 것과 같습니다).
이것은 기발한 것이 있지만 S (n ^ 2-1)은 항상 √ (n ^ 2)이지만 일반적으로 매우 정확합니다. 더 큰 경우에는 99.99 % 이상의 정확도를 가질 수 있습니다.
입력과 출력
편리한 형식으로 하나의 숫자를 사용합니다.
예
형식 : 입력-> 출력
2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37 // actually 4.37 + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91 // actually 6.91 + 1/300
57 -> 7.57 // actually 7.57 + 1/700
2612 -> 51.10 // actually 51.10 + 2/255
643545345 -> 25368.19 // actually 25,368.19 + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481
명세서
-
출력은 최소한 가장 가까운 100 분의 1로 반올림되어야합니다 (예 : 답이 47.2851 인 경우 47.29를 출력 할 수 있음)
-
답이 정수이면 출력에 다음과 같은 0과 소수점이 없어도됩니다 (예 : 125.00도 125와 125.0으로 출력 가능)
-
1 미만의 숫자는 지원하지 않아도됩니다.
-
정수가 아닌 입력을 지원하지 않아도됩니다. (즉, 1.52 등 …)
규칙
표준 허점 은 금지되어 있습니다.
이것은 code-golf 이므로 바이트 단위의 최단 답변이 이깁니다.
답변
젤리 , 8 7 바이트
Olivier Grégoire의 단순화 된 수학 공식 덕분에 -1 바이트 덕분에 Java 답변을 참조하십시오 .
÷ƽ+ƽH
어떻게?
÷ƽ+ƽH - Link: number, n
ƽ - integer square root of n -> s
÷ - divide -> n / s
ƽ - integer square root of n -> s
+ - add -> n / s + s
H - halve -> (n / s + s) / 2
답변
하스켈 , 34 바이트
f x=last[s+x/s|s<-[1..x],s*s<=x]/2
명령형 의사 코드의 설명 :
results=[]
foreach s in [1..x]:
if s*s<=x:
results.append(s+x/s)
return results[end]/2
답변
Java (OpenJDK 8) , 32 바이트
n->(n/(n=(int)Math.sqrt(n))+n)/2
설명
코드는 다음과 같습니다.
double approx_sqrt(double x) {
double s = (int)Math.sqrt(x); // assign the root integer to s
return (x / s + s) / 2
}
뒤에 수학 :
s + (x - s²) / (2 * s) = (2 * s² + x - s²) / (2 * s)
= (x + s²) / (2 * s)
= (x + s²) / s / 2
= ((x + s²) / s) / 2
= (x / s + s² / s) / 2
= (x / s + s) / 2
답변
파이썬 2 , 47 … 36 바이트
@JungHwanMin 덕분에 -3 바이트 @HyperNeutrino 덕분에
-1 바이트 @JonathanFrech 덕분에
-2 바이트
@ OlivierGrégoire 덕분에 -3 바이트
def f(x):s=int(x**.5);print(x/s+s)/2
답변
답변
R, 43 바이트 29 바이트
x=scan()
(x/(s=x^.5%/%1)+s)/2
새로운 방정식을위한 @Giuseppe에게 정수 나누기 솔루션으로 12 바이트의 골프를 돕습니다. 스캔을위한 함수 호출을 교체함으로써, 나는 또 다른 몇 바이트를 골랐다.