求平方根,要求精度到小数点后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位的主要内容,如果未能解决你的问题,请参考以下文章