如何修改二分查找求平方根代码以支持任意n次方根计算?
改造二分查找代码支持任意次方根
先看修改后的完整代码:
# 获取用户输入的目标数和次方数 num = float(input('请输入要求方根的数字:')) n = int(input('请输入要求的次方根(如2为平方根,3为立方根):')) # 处理特殊情况:0的任何正数次方根都是0 if num == 0: print(f'{num}的{n}次方根是0.0') exit() # 确定二分查找的初始区间 abs_num = abs(num) x = 0.0 # 当n为偶数时,次方根非负,初始上限设为max(abs_num, 1);奇数时可以包含负数区间 if n % 2 == 0: if num < 0: print(f'负数的偶次方根没有实数解') exit() y = max(abs_num, 1.0) else: # 负数的奇次方根是负数,初始区间设为负数到正数的合理范围 x = -max(abs_num, 1.0) y = max(abs_num, 1.0) ans = 0.0 # 精度阈值,可根据需要调整 epsilon = 0.0001 while abs(ans**n - abs_num) > epsilon: ans = (x + y) / 2.0 current = ans**n if current < abs_num: # 如果当前n次方小于目标绝对值,说明需要增大ans(分奇偶处理方向) if n % 2 == 0 or ans >= 0: x = ans else: y = ans else: # 当前n次方大于等于目标绝对值,需要减小ans if n % 2 == 0 or ans >= 0: y = ans else: x = ans # 处理负数的奇次方根符号 if num < 0 and n % 2 != 0: ans = -ans print(f'{num}的{n}次方根是{ans}')
关键改动说明:
- 增加次方数输入:新增获取次方数
n的步骤,让用户自定义方根类型。 - 特殊情况处理:
- 直接返回0的方根结果,避免无效循环;
- 提前判断负数的偶次方根,告知无实数解。
- 调整初始查找区间:
- 偶次方根:结果非负,区间设为
[0, max(abs(num), 1)](适配大于1和小于1的数的方根特性); - 奇次方根:支持负数结果,区间设为
[-max(abs(num), 1), max(abs(num), 1)]。
- 偶次方根:结果非负,区间设为
- 替换核心运算:把原代码固定的平方运算
**2替换为**n,适配任意次方计算。 - 符号修正:对负数的奇次方根,最后给结果添加负号,保证数值正确性。
内容的提问来源于stack exchange,提问作者alla fine moriremo tutti
相关产品推荐
相关产品推荐

