本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为中等题HJ107 求解立方根
HJ107 求解立方根
描述
计算一个浮点数的立方根,不使用库函数。
保留一位小数。
数据范围:∣val∣≤20
输入描述:
待求解参数,为double类型(一个实数)
输出描述:
输出参数的立方根。保留一位小数。
示例1
输入:
19.9
输出:
2.7
示例2
输入:
2.7
输出:
1.4
代码
二分查找
while True:
try:
n = float(input())
if n > 0:
sig = 1
else:
sig = -1
n = abs(n)
if n > 1:
start = 0
end = n
else:
start = n
end = 1
while start < end:
mid = start + (end - start) / 2
if abs(mid**3 - n) < 0.001:
break
if mid**3 > n:
end = mid
else:
start = mid
print(round(sig*mid,1))
except:
break
牛顿迭代法
while True:
try:
a = float(input())
e = 0.0001
t = a
while abs(t*t*t - a) > e:
t = t - (t*t*t - a) * 1.0 / (3 * t*t)
print("%.1f" % t)
except:
break
解析
两种方法呀,简单粗暴的还有稍微高级点的。
方法一:
二分法,要考虑这个需要求解立方根的数是正数还是负数,是大于1的数还是小于1的数,然后分开处理。
具体方法:
1、把正负号保存起来,转化成正数进行处理
2、分成大于1和小于1进行二分查找(因为大于1和小于1的三次方变化方向不一样,小于1的数越大三次方越小,大于1的数越大三次方越大)
3、恢复正负数,进行输出
方法二
牛顿迭代法,数学人看到这个解法的时候好亲切,见到家人的感觉。不知道怎么解释这个方法比较好,就是用到了牛顿迭代公式。
至于公式的推导过程好像也不是很重要(虽然上课详细推到过考试还考了推导,但是并不影响我如今只记得公式了),没有需要解释推到的地方,基本都是直接用......