首页 > 试题广场 >

求解立方根

[编程题]求解立方根
  • 热度指数:309871 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
计算一个浮点数的立方根,不使用库函数。
保留一位小数。

数据范围:


输入描述:

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



输出描述:

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

示例1

输入

19.9

输出

2.7
示例2

输入

2.7

输出

1.4
注意处理小数和负数情况
用左右区间来限制目标值的精度
n = input()
if n < 0:
    if n > -1:
        l = -1
        r = 0
    else:
        l = n 
        r = 0
else:
    if n < 1:
        l = 0
        r = 1 
    else:
        l = 0
        r = n 
while (r-l) > 0.001:
    mid = l + (r-l) / 2.0
    #print(mid, mid**3, n)
    if mid ** 3 > n:
        r = mid 
    elif mid ** 3 == n:
        l = mid 
        break 
    else:
        l = mid 
print('%.1f'%l)


发表于 2021-06-30 17:17:44 回复(0)
初步求得解之后,还需要前后试探0.1,选出其立方与输入的数字最接近的。

while True:
    try:
        num = eval(input())
        x0 = min(-1,num)
        x1 = max(1,num)
        x = (x0+x1)/2
        while abs(x**3 - num) > 0.0001:
            x = (x0+x1)/2
            if x**3 > num:
                x1 = x
            else:
                x0 = x
        x = round(x,1)
        # 排除与round相关的误差,如num=31.26
        # print(x)
        xs = [x-0.1, x, x+0.1]
        errors = list(map(lambda x:abs(x**3-num), xs))
        index = errors.index(min(errors))
        print(xs[index])
    except:
        break
       
发表于 2021-05-15 17:14:39 回复(0)
while True:
    try:
        num = float(input())
        a = abs(num)
        root = 0
        for i in range(0, int(a)+1):
            if i*i*i > a:
                root += i-1
                break

        for j in range(0, 10):
            test = root + j*0.1
            if test*test*test > a:
                root += (j-1)*0.1
                break

        for k in range(0, 10):
            test = root + k*0.01
            if test*test*test > a:
                if k >= 5:
                    root += 0.1
                break
        if num >= 0:
            print('%.1f'% root)
        else:
            print('%.1f' % -root)
    except:
        break
发表于 2021-03-29 14:22:31 回复(0)
while True:
    try:
        input_ = input()
        if input_[0] == '-':
            input_ = float(input_[1:])
            print(round(0-input_**(1./3.),1))
        else:
            input_ = float(input_)
            print(round(input_**(1./3.),1))
    except:
        break

发表于 2021-03-25 08:20:24 回复(0)
while True:
    try:
        print(round(eval(input()+'**(1/3)'),1))
    except:
        break

发表于 2021-03-22 23:23:40 回复(1)
写一个梯度下降的解法。
给定n,求x^3=n的根x。
使用平方误差作为损失函数,损失函数l=(x^3-n)^2
l对x求导数:6*(x**2)*(x**3-n)
因为x小于0时,损失函数不是凸函数,所以特殊处理一下n<0的情况,统一计算n>0的情况。
根据梯度下降很容易写出AC代码。

n=float(input())
op=-1 if n<0 else 1
n=op*n
lr=0.0001
x=0.1
for i in range(1000000):
    delta=6*(x**2)*(x**3-n)
    x=x-lr*delta
print(op*round(x,1))


编辑于 2021-03-14 19:46:04 回复(0)
a = eval(input())
num=abs(a)
start=0
end=num
mid=(start+end)/2
while abs(mid**3-num)>0.001:
    if mid**3>num:#猜的数大了
        end=mid
    else:#猜的数小了
        start=mid
    mid=(start+end)/2
if a<0:#若输入值为负值
    print(-round(mid,1))
else :
    print(round(mid,1))


发表于 2021-02-17 22:56:25 回复(0)
# 牛顿迭代法求解立方根的思路:
# 令f(x) = x^3 - a,求解f(x) = x^3 - a = 0。
# 利用泰勒公式展开,即f(x)在x0处的函数值为:
# f(x) = f(x0) +f'(x0)(x-x0) = (x0^3-a) + (3x0^2)(x-x0) = 0,
# 解之得:x = x0 - (x0^3 - a) / (3x0^2)。
#     即 x = x - ((x*x*x - n) / (3*x*x));

# 拓展:求平方根用一个套路:
# 令f(x) = x^2 - a,求解f(x) = x^2 - a = 0。
# 利用泰勒公式展开,即f(x)在x0处的函数值为:
# f(x) = f(x0) +f'(x0)(x-x0) = (x0^2-a) + 2x0(x-x0) = 0,
# 解之得:x = x0 - (x0^2 - a) / 2x0
#     即 x = x - (x*x-a)/2x 可进一步化简为:=(x+a/x) / 2。

# 总结:
# 平方根与立方根的求解迭代公式:
# 新x = 旧x - f(x)/f'(x)
# 新x = 旧x - (x平方或者立方与输入数a的差)/f(x)求导数


# 法一:牛顿迭代法
a = float(input().strip())  # 获取输入的实数a
e = 0.0001  # 设定一个精度值
t = a  # 初始化立方根t的值为输入的值a
while abs(t*t*t - a) > e:  # 差值没有达到精度,便一直更新立方根
    # x(i+1) = x(i) - f(xi)/f'(xi)
    # 更新后的x = 原x - (原x的立方-a)/f(原x)导数
    t = t - (t*t*t - a) * 1.0 / (3 * t*t)
print("%.1f" % t)  # 当精度达到要求时,此时的立方根t便为输入实数的立方根解。

# 法二:二分法
a = float(input().strip())
epsilon = 0.0001
low = min(-1.0, a)
high = max(1.0, a)
ans = (low + high)/2
while abs(ans**3 - a) >= epsilon:
    if ans**3 < a:
        low = ans
    else:
        high = ans
    ans = (low + high)/2.0
print('%.1f' % ans)

编辑于 2020-12-25 11:36:13 回复(0)
import sys


def newton(n):
    pass


def bin_search(n, l, r):
    if r-l < 0.01:
        return l
    mid = (l+r)/2
    if mid**3 == n:
        return mid
    elif mid**3 < n:
        return bin_search(n, mid, r)
    else:
        return bin_search(n, l, mid)


for i in sys.stdin:
    i = float(i)
    if i == 0:
        print(0.0)
    elif i > 0:
        l, r = (1, i) if 1<i else (i, 1)
    else:
        l, r = (-1, i) if -1<i else (i, -1)
    print(round(bin_search(i, l, r), 1))

发表于 2020-12-19 18:03:36 回复(1)
python 不用库函数,硬算解法:
while True:
    try:
        num = float(input())
        if num >= 0:
            res = num ** (1/3)
            print(round(res,1))
        else:
            res = (-1*num)**(1/3)
            print(round(-1*res,1))
    except:
        break

发表于 2020-12-04 09:51:04 回复(0)
数值分析课程  牛顿不动点迭代法
python3
# print('%0.1f' % ((float)(input())**(1/3)))

a = float(input())
x = 1
while 1: #迭代
    x = x-(x*x*x-a)/(3*x*x)  # 牛顿不动点迭代法
    if x*x*x-a<1e-2:
        break
print('%0.1f' % x)


发表于 2020-11-20 13:23:27 回复(0)
这个简单
print(round((float(input())**(1/3)), 1))

发表于 2020-11-08 19:54:01 回复(0)
def gradient_descent(n): #最小二乘法 梯度
    x = 1
    alpha = 0.001  # 注意学习率不能太大,否则会引发震荡甚至发散
    deta = 1
    count = 1
    while abs(deta) > 0.00001:
        deta = 6 * x**2 * (x ** 3 - n)
        x -= alpha * deta  # 通过梯度更新x值
        count += 1
    return x


x = gradient_descent(int(input()))
print("%.1f" % x)
#牛顿法
def root(a, n=3): #n为n次方根
    y = lambda x: x**n
    dy_dx = lambda x:n*x**(n-1)
    dx = lambda x: (a - y(x))/dy_dx(x)

    x = 1
    for _ in range(100):
        x += dx(x)

    return x

print('%.1f'%root(int(input())))

发表于 2020-10-23 14:46:31 回复(0)

牛顿迭代法python求解

思路:求n的立方根,初始化x=1,按照牛顿迭代法公式迭代x直至 x接近立方根(x三次方与n的绝对值小于1e-7),输出。
n = float(input())
x = 1
while abs(x**3-n)>1e-7:
    x = (2*x/3)+n/3/x/x
print(round(x,1))



发表于 2020-10-06 00:11:32 回复(1)
那么问题来了,原生运算符 属于 库函数吗?
while True:
    try:
        n =float(input().strip())
        print('{:.1f}'.format(n ** (1 / 3)))
    except:
        break
        


编辑于 2020-10-05 10:49:03 回复(0)

while True:
    try:
        template = '{:.1f}'        
        a = float(input())
        m1 = 0
        m2 = a
        test = (m1+m2)/2
        temp = 0
        while True:
            if (test*test*test) > a:
                if (temp-test)*(temp-test) <= 0.000001:
                    print(template.format(test))
                    break                
                m2 = test
                temp = test
                test = (m2+m1)/2
            elif (test*test*test) < a:
                if (temp-test)*(temp-test) <= 0.000001:
                    print(template.format(test))
                    break                
                m1 = test   
                temp = test
                test = (m1+m2)/2
            else:
                print(template.format(test)) 
                break
    except:
        break
发表于 2020-09-15 19:56:19 回复(0)
# have a  look of  this one
def cuberoot():
    ans = int(input("enter a number:"))
    for i in range(0, ans):
        ans2 = i*i*i
        ans3 = i*i
        if ans2 == ans:
            ans4 =ans/ans3
        
            print(f"cuber root of {ans} is {ans4} ")
        
cuberoot()



发表于 2020-09-01 13:09:21 回复(0)
Py一行代码就可以呀
print(round(int(input())**(1/3),1))

发表于 2020-08-27 15:31:30 回复(1)

问题信息

难度:
51条回答 57973浏览

热门推荐

通过挑战的用户

查看代码