牛客网学习笔记(HJ107 求解立方根)

372 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为中等题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、恢复正负数,进行输出
方法二
牛顿迭代法,数学人看到这个解法的时候好亲切,见到家人的感觉。不知道怎么解释这个方法比较好,就是用到了牛顿迭代公式。
至于公式的推导过程好像也不是很重要(虽然上课详细推到过考试还考了推导,但是并不影响我如今只记得公式了),没有需要解释推到的地方,基本都是直接用......