近似我的平方


10

受到tecmath 这段视频启发

x通过取整数平方根s(即使得的最大整数s * s ≤ x)然后计算,可以找到任意数量的平方根的近似值s + (x - s^2) / (2 * s)。让我们称之为近似值S(x)。(注意:这等效于应用牛顿-拉夫森方法的一个步骤)。

尽管这确实有些古怪,但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

技术指标

  • 您的输出必须四舍五入到至少最接近的百分位数(即,如果答案为47.2851,则您可以输出47.29)

  • 如果答案是整数,则输出不必带有零和小数点(例如125.00也可以输出为125和125.0)

  • 您不必支持1以下的任何数字。

  • 您不必支持非整数输入。(即1.52等...)

规则

禁止使用标准漏洞

这是一个,因此最短答案以字节为单位。



3
注意:s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
JungHwan Min

我的解决方案:Pyth25个字节14个字节
Stan Strum,

是否需要至少2位数字准确?
完全人类

@totallyhuman是的。47.2851可以表示为47.28,但不再不准确。
Stan Strum,

Answers:


2

果冻 8  7 字节

感谢OlivierGré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

7个字节:÷ƽ+ƽH第一次尝试使用Jelly,所以我可能是错的。但愿我知道如何存储ƽ,以免重复。那可能会节省另一个字节。
奥利维尔·格雷戈尔(OlivierGrégoire),

谢谢@OlivierGrégoire!ƽɓ÷⁹+H不会重新计算整数根,但是它也是7。ɓ用交换的参数开始一个新的二元链,然后引用该链的右参数(即的结果ƽ)。ƽɓ÷+⁹H也可以在这里工作。
乔纳森·艾伦

4

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

4

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
好吧,它四舍五入到小于最接近的百分之一,因此它是完全有效的。
奥利维尔·格雷戈尔

啊,我明白了,我的误会。
Ayb4btu

4

Python 2中47 ... 36个字节

感谢@JungHwanMin -3个字节感谢@HyperNeutrino
-1个字节-感谢@JonathanFrech
感谢-2个
字节感谢@OlivierGrégoire感谢-3个字节

def f(x):s=int(x**.5);print(x/s+s)/2

在线尝试!


-2个字节:s+(x-s*s)/s/2(x+s*s)/s/2
JungHwan Min

-2字节使用函数
HyperNeutrino

@HyperNeutrino我只得到-1个字节
ovs

哦,对不起,我在测试后不小心删除了一个字符,然后计算了之后的字节数:P yeah仅-1
HyperNeutrino

您可以不省略+.0并替换/s/2/2./s,节省两个字节吗?
乔纳森·弗雷希


3

R,43字节 29字节

x=scan()
(x/(s=x^.5%/%1)+s)/2

感谢@Giuseppe提供了新的等式,并使用整数除法解决方案帮助高尔夫球了12个字节。通过换出函数调用进行扫描,我又打了几个字节。

在线尝试!


1
35个字节 ; 更一般而言,您可以使用TIO的“标头”字段并输入f <- 来分配功能。但是,仍然是一个不错的解决方案,请确保您有机会阅读R中的高尔夫技巧
朱塞佩



2

JavaScript(ES7),22个字节

x=>(s=x**.5|0)/2+x/s/2

我们实际上不需要中间变量,因此实际上可以将其重写为:

x=>x/(x=x**.5|0)/2+x/2

测试用例




2

AWK47 44 38字节

{s=int($1^.5);printf"%.2f",$1/2/s+s/2}

在线尝试!

注意:TIO像有2个额外的字节 \n以使输出更漂亮。:)

感觉有点像使用sqrt来查找平方根,所以这里有一个更多字节的版本。

{for(;++s*s<=$1;);s--;printf("%.3f\n",s+($1-s*s)/(2*s))}

在线尝试!


1
好吧,你可以说这是AWKward。我将展示自己。编辑:最初我计划使用sqrt避开该问题,但是答案太多,如果更改它,我会受到侵权,因此我的初衷行得通。
Stan Strum

“ AWK”双关语很有趣:)
罗伯特·本森

而不是sqrt($1)您可以使用$1^.5
Cabbie407

谢谢@ Cabbie407不知道为什么我没有想到这一点。
罗伯特·本森

1
别客气。其他一些事情:您不需要\n获得输出,awk中的printf不需要括号,并且公式可以缩短为s/2+$1/s/2,结果为{s=int($1^.5);printf"%.2f",s/2+$1/s/2}。抱歉,如果此评论不礼貌。
Cabbie407 '17


1

PowerShell,54个字节

param($x)($x+($s=(1..$x|?{$_*$_-le$x})[-1])*$s)/(2*$s)

在线尝试!验证一些测试用例

接受输入$x,然后完全按照要求进行操作。该|?部分找到最大整数,该整数在平方时-l等于e输入等于或小于等于$x,然后我们执行所需的计算。输出是隐式的。


哇。我从不了解人们如何在Windows Powershell中打高尔夫球
Stan Strum,

@StanStrum你并不孤单,大声笑。:D
AdmBorkBork,

1

外壳,9个字节

½Ṡ§+K/(⌊√

在线尝试!

这个答案仍然有些丑陋,但我似乎找不到更短的解决方案。

说明

我正在实现牛顿算法的一个步骤(实际上等效于此问题中提出的步骤)

½Ṡ§+K/(⌊√
  §+K/       A function which takes two numbers s and x, and returns s+x/s
 Ṡ           Call this function with the input as second argument and
      (⌊√    the floor of the square-root of the input as first argument
½            Halve the final result

我认为您想要的是实际的划分,而不是÷
H.PWiz

@ H.PWiz哎呀,谢谢。这是寻找其他解决方案的实验的剩余内容
-Leo

1

Pyt11 10字节

←Đ√⌊Đ↔⇹/+₂

说明

code                explanation                        stack
←                   get input                          [input]
 Đ                  duplicate ToS                      [input,input]
  √⌊                calculate s                        [input,s]
    Đ               duplicate ToS                      [input,s,s]
     ↔              reverse stack                      [s,s,input]
      ⇹             swap ToS and SoS                   [s,input,s]
       /            divide                             [s,input/s]
        +           add                                [s+input/s]
         ₂          halve                              [(s+input/s)/2]
                    implicit print

刚看到这一点,这是一个好时机,直到我意识到这不是Pyth。好答案。
Stan Strum,

是的,这是我已经考虑了一段时间的一种语言,只是决定实际使用。
mudkip201

ToS是栈顶吗?如果是,那么SoS是什么?
Stan Strum,

ToS是堆栈的顶部,而SoS是堆栈的第二个
mudkip201

好的,我看看是否可以研究这种语言。我喜欢!
Stan Strum

1

银河系17 14字节

使用OlivierGrégoire的公式-3个字节

^^':2;g:>/+2/!

在线尝试!

说明

code              explanation                   stack layout

^^                clear preinitialized stack    []
  ':              push input and duplicate it   [input, input]
    2;            push 2 and swap ToS and SoS   [input, 2, input]
      g           nth root                      [input, s=floor(sqrt(input))]
       :          duplicate ToS                 [input, s, s]
        >         rotate stack right            [s, input, s]
         /        divide                        [s, input/s]
          +       add                           [s+input/s]
           2/     divide by 2                   [(s+input/s)/2]
             !    output                        => (s+input/s)/2

那不是地板而不是天花板吗?
mudkip201

@ mudkip201更新,谢谢
ovs '17

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.