求平方根,要求精度到小数点后10位

Posted JackLee18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求平方根,要求精度到小数点后10位相关的知识,希望对你有一定的参考价值。

  这个算法题之所以单独整理下,是因为这个算法题让我对算法有了灵感。仿佛打开了一扇门。

计算机语言转换

  根据题目,我们可以将题目转换成计算机语言如下:求一个数的平方根,这个平方根k的取值范围在0~n之间,同时小数点后保持10位的精度。我们最后的精度为0.0000000001,那么k必须同时满足k *k <=n,(k+0.0000000001) *(k+0.0000000001)> n。

解题思路

  根据上面的条件,我们首先会发现k的取值在0~n之间,0 ~n之间的数是从小到大排列的,我们看做是一个有序集合,只不过这个集合再是整数的集合,也包含了小数。我们求解的过程就可以转换成在有序的数组里查找符合条件的数字,刚好可以用到二分查找,这样效率会更高些。但是如果一开始就从最高精度开始查找的话,会导致查找次数较多。我这边将查找分成了两种情况,整数部分和小数部分的查找,整数部分直接二分查找,小数部分每次只查找某个精度下的小数,然后叠加得到最后的结果。

代码示例

示例代码如下:
我这边使用的语言是swift

/// 求平方根函数
/// - Parameters:
///   - n: 需要求解的数
///   - length: 小数的精度
/// - Returns: 结果
func qrValue(n:Int,length:Int) ->Double 
    
    var unit = 10.0
    var reslut:Double = 0
    for _ in 0...length 
        print("qrValue")
        unit = unit/10
        if (unit == 1.0) 
            reslut += binarySearchInt(n: n, low: 0, high: n, unit: unit)
        else 
           var dot = binarySearchDot(n: n,lastResult: reslut, low: 0, high: 9, unit:
                                        unit)
            let tail:Int = Int(dot/unit)
            dot = Double(tail) * unit
            reslut += dot
        
        if (reslut * reslut == Double(n)) 
            return reslut
        
    
    
    return reslut


/// 整数部分的查找
/// - Parameters:
///   - n: 需要求解的数字
///   - low: 低位数字
///   - high: 高位数字
///   - unit: 精度单元
/// - Returns: 结果
func binarySearchInt(n:Int,low:Int,high:Int,unit:Double) -> Double 
    let middle:Int = Int((low + high)/2)
    print("binarySearchInt:\\(middle)")
    if (middle * middle < n) 
        if ((middle + 1) * (middle + 1) >= n) 
            return Double(middle)
         else 
            return binarySearchInt(n: n, low: middle, high:high , unit: unit)
        
     else if (middle * middle > n) 
        if ((middle - 1) * (middle - 1) <= n) 
            return Double(middle-1)
         else 
            return binarySearchInt(n: n, low: low, high:middle-1 , unit: unit)
        
     else 
        return Double(middle)
    


/// 小数部分的查找
/// - Parameters:
///   - n: 需要求解的数字
///   - lastResult: 上次的计算结果
///   - low: 低位数字
///   - high: 高位数字
///   - unit: 精度单元
/// - Returns: 结果
func binarySearchDot(n:Int,lastResult:Double,low:Double,high:Double,unit:Double) -> Double 
    let dot:Double = (low+high)/2
    print("binarySearchDot")
    if ((lastResult + dot) * (lastResult + dot) < Double(n)) 
        if ((lastResult + dot + unit) * (lastResult + dot + unit) >= Double(n)) 
            return dot
         else 
            return binarySearchDot(n: n, lastResult: lastResult, low: dot, high: high, unit: unit)
        
     else if ((lastResult + dot) * (lastResult + dot) > Double(n)) 
        if ((lastResult + dot - unit) * (lastResult + dot - unit) <= Double(n)) 
            return dot - unit
         else 
            return binarySearchDot(n: n, lastResult: lastResult, low: low, high: dot, unit: unit)
        
    
    return dot


let result = qrValue(n: 11, length: 10)
print("result:\\(result)")

运算结果:

以上是关于求平方根,要求精度到小数点后10位的主要内容,如果未能解决你的问题,请参考以下文章

求平方根,要求精度到小数点后10位

习题2-5 求平方根序列前N项和 (15分)

[PTA]实验2-4-3 求平方根序列前N项和

2-3 求平方与倒数序列的部分和

2-3 求平方与倒数序列的部分和

14 求平方和与倒数序列的部分和