华为笔试——求解立方根

描述

计算一个浮点数的立方根,不使用库函数。

保留一位小数。

数据范围:∣𝑣𝑎𝑙∣≤20 ∣val∣≤20 

输入描述:

待求解参数,为double类型(一个实数)

输出描述:

输出参数的立方根。保留一位小数。

示例1

输入:

19.9

输出:

2.7

示例2

输入:

2.7

输出:

1.4

本题不允许用库函数,则可以通过反向求三次方的方法来解决,要注意输入数据的正负性,以及正负数各自的距离判定方法。

num=float(input())

if num>0:
    frontnum=0.1
    nextnum=0.2
    for _ in range(30):
        if frontnum**3>=num:
            print(0.1)
            break
        else:
            if nextnum**3<num:
                frontnum+=0.1
                nextnum+=0.1
                continue
            elif frontnum**3==num:
                print(round(frontnum,1))
                break
            elif frontnum**3<num and nextnum**3>num:
                if num-frontnum**3>nextnum**3-num:
                    print(round(nextnum,1))
                    break
                else:
                    print(round(frontnum,1))
                    break
elif num==0:
    print(0.0)
else:
    frontnum=-0.1
    nextnum=-0.2
    for _ in range(30):
        if frontnum**3<=num:
            print(-0.1)
            break
        else:
            if nextnum**3>num:
                frontnum-=0.1
                nextnum-=0.1
                continue
            elif frontnum**3==num:
                print(round(frontnum,1))
                break
            elif frontnum**3>num and nextnum**3<num:
                if frontnum**3-num>num-nextnum**3:
                    print(round(nextnum,1))
                    break
                else:
                    print(round(frontnum,1))
                    break
### 计算立方根算法与实现 #### 牛顿迭代法求解立方根 一种常见的值方法用于求解立方根是牛顿迭代法。该方法通过不断逼近目标值来获得精确的结果。以下是基于 Python 的具体实现: ```python def cuberoot_newton(n): if n == 0: return 0 # 初始猜测值 x = n / 2.0 tolerance = 1e-7 # 容差范围 max_iterations = 1000 # 防止无限循环的最大迭代次 for _ in range(max_iterations): f_x = x ** 3 - n # 函值 f_prime_x = 3 * (x ** 2) # 导值 if abs(f_prime_x) < tolerance: # 避免除零错误 break next_x = x - f_x / f_prime_x # 更新公式 if abs(next_x - x) < tolerance: # 达到收敛条件 return round(next_x, 5) x = next_x # 更新当前估计值 raise ValueError("无法在指定范围内找到立方根") # 若未收敛则抛出异常 num = float(input("请输入一个字:")) result = cuberoot_newton(num) print("输入字的立方根为:", result) ``` 这种方法的核心在于使用导逐步调整初始猜测值,直到满足一定的误差阈值为止[^1]。 --- #### 学上的二分查找法 另一种常用的方法是二分查找法,适用于任何单调函(如 $y=x^3$)。其基本思想是在一定区间内反复缩小可能解所在的范围,直至达到所需的精度。 ```python def cuberoot_bisection(n, precision=1e-7): if n == 0: return 0 low, high = (-abs(n), 0) if n < 0 else (0, abs(n)) while high - low > precision: mid = (low + high) / 2.0 cube_mid = mid ** 3 if abs(cube_mid - n) <= precision: return round(mid, int(-log10(precision))) if cube_mid < n: low = mid else: high = mid return round((high + low) / 2.0, int(-log10(precision))) from math import log10 number = float(input("请输入一个字:")) cube_root_result = cuberoot_bisection(number) print("输入字的立方根为:", cube_root_result) ``` 此方法的优势在于逻辑简单且易于理解,尤其适合初学者学习值分析的基础概念[^4]。 --- #### Java 实现四舍五入保留一位小 如果需要在其他编程语言中完成类似功能,比如 Java 中处理浮点并控制输出格式,则可参考如下代码片段: ```java import java.util.Scanner; public class CubeRoot { public static double calculateCubeRoot(double number) { double guess = number / 2; final double TOLERANCE = 1E-7; int iterations = 0; do { double newGuess = ((2 * guess) + (number / Math.pow(guess, 2))) / 3; if (Math.abs(newGuess - guess) < TOLERANCE || ++iterations > 1000) { return Double.parseDouble(String.format("%.1f", newGuess)); } guess = newGuess; } while (true); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个字:"); double inputNumber = scanner.nextDouble(); String formattedResult = String.format("%.1f", calculateCubeRoot(inputNumber)); System.out.println("输入字的立方根为:" + formattedResult); } } ``` 这里采用了 `String.format` 方法对最终结果进行了格式化操作,确保只显示一个小位[^3]。 --- #### 华为 OD 据结构与算法解析中的应用案例 对于某些特定场景下的需求,例如快速估算或批量验证大量据集内的立方根情况时,可以考虑优化以上两种基础方案之一。通常情况下,选择哪种方式取决于实际应用场景以及性能指标的要求[^4]。 --- ### 总结 无论是采用牛顿迭代还是二分查找策略,都可以有效解决大多关于实域内的立方根计算问题。然而,在工程实践中还需综合考量运行效率、内存占用等因素后再做决定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值