求解立方根

https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca?tpId=37&tqId=21330&tPage=6&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking

 

一、题目描述

不使用库函数,计算一个浮点数的立方根,要求返回的立方根也是浮点数,并且只保留一位小数位

 

二、代码实现

1、暴力法

先得到最后一个立方小于等于input的整数,然后再一次次加0.1,找到第一个立方大于input的浮点数 i,然后根据情况打印 i 或者 (i-0.1)即可。

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            double input = sc.nextDouble();
            
            double i = 0.0;
            for (i=0; i input) {
                    break;
                }
            }
            
            while (i*i*i <= input) {
                i += 0.1;
            }
            
            //取与input相差最小的那一个
            if (Math.abs((i-0.1)*(i-0.1)*(i-0.1)-input) < Math.abs(i*i*i-input)) {
                System.out.println(String.format("%.1f", i-0.1));
            } else {
                System.out.println(String.format("%.1f", i));
            }
        }
    }
    
}

2、泰勒公式

上面的问题等价于令f(x) = x^3 - y,求解f(x) = x^3 - y = 0,根据泰勒公式有f(x) = f(x0) + f'(x0)(x - x0) = (x0^3) - y + 3(x0^2)(x-x0) = 0,所以有 x = x0 - (x0^3 - y) / 3(x0^2)

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int input = sc.nextInt();
        double ret = 1.0;
        while (Math.abs(ret*ret*ret-input) > 1e-9) {
            ret = ret - ((ret*ret*ret-input) / (3*ret*ret));
        }
        System.out.printf("%.1f", ret);
    }
    
}

同理求解平方根也是如此,f(x) = x^2-y,求解f(x)=x^2-y=0.用泰勒公式展开为f(x)=f(x0)+f'(x0)(x-x0)=x0^2-y+2x0*(x-x0)=0,所以有x=(x0+y/x0) / 2。

 

你可能感兴趣的:(华为机试)