Scala中的整数平方根

时间:2016-12-03 17:30:30

标签: scala integer sqrt

我的问题是通过Scala为整数创建一个sqrt函数

f.e。:sqrt(26)= 6,s²> = n sqrt(0)= 0,sqrt(1)= 1,sqrt(2)= 2,sqrt(3)= 2,sqrt(4)= 2,sqrt(5)到sqrt(9)= 3 ....

这是我提出的代码:

def sqrt (n: Int): Int = {          

  def sq (a: Int, n: Int): Int = {
    val b = (a + n) / 2
    val c = (b + n / b) / 2
    if (b * b == n) b 
    else if (b * b < n) b + 1
    else c 
  }
  if (n == 0 || n == 1) n else sq (0 , n)       
}

然而,它不适用于所有数字n&gt; = 0。 f.e。:6为2,我如何调整我的公式?

3 个答案:

答案 0 :(得分:0)

尝试将更改类型设为Double。结果应该是显而易见的。

 object Math {

  def roundUp(d: Double) = math.ceil(d).toInt

  def abs(x: Double) = if (x < 0) -x else x

  def sqrt(x: Double) = roundUp( sqrtIter(1.0, x) )

  def sqrtIter(guess: Double, x: Double): Double =
    if (isGoodEnough(guess, x)) guess
    else sqrtIter(improve(guess, x), x)

  def isGoodEnough(guess: Double, x: Double) =
    abs(guess * guess - x) < .01

  def improve(guess: Double, x: Double) =
    (guess + x / guess) / 2
}

val r = Math.sqrt(24)

答案 1 :(得分:0)

    def sqrt (n: Int): Int = {

    def sq (a: Int, n: Int): Int = if (a * a >= n) a else sq (a+1 , n)

    if (sq (0 , n) * sq (0 , n) >= n) sq (0 , n) else sqrt (sq (0 , n))
    }

这是一个简单而好的解决方案。

答案 2 :(得分:0)

我为Pavel的代码添加了一些小改进:roundUp函数并没有真正加起来,而且它给出了错误的结果。由于平方根值通常包含小数,因此我将小数限制为2位数。

def trim(d:Double) = "%1.2f".format(d)

def sqrt(x: Double) =  trim( sqrtIter(1.0, x) ) //(replace /**roundUp**/ with trim)