题解 | #求解立方根#

求解立方根

https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String a;
        try {
            a = in.readLine();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        double n = parse(a);
        boolean boln = n < 0 ? true : false;
        if (boln)
            n = -n;
        n = func1(n);
        System.out.print(boln ? -n : n);
    }

    static double parse(String a) {
        double n1 = 0, n2 = 0, dec = 1;
        int i = 0, l = a.length();
        boolean bool = false, negative = false;
        char[] chrAy = new char[l];
        a.getChars(0, l, chrAy, 0);
        if (chrAy[0] == '-') {
            negative = true;
            i = 1;
        }
        while (i < l) {
            if (chrAy[i] == '.')
                bool = true;
            else {
                if ((chrAy[i] - '0' | '9' - chrAy[i]) > 0) {
                    if (bool) {
                        dec *= 0.1;
                        n2 *= 10;
                        n2 += chrAy[i] - '0';
                    } else {
                        n1 *= 10;
                        n1 += chrAy[i] - '0';
                    }
                }
            }
            i++;
        }
        n1 += n2 * dec;
        return negative ? -n1 : n1;
    }

    static double func1(double n) {
        double left = 0, right = n < 1 ? 1 : n, mid = 0, t = 0, div = 0;
        while (left < right) {
            mid = (left + right) / 2;
            t = mid * mid * mid;
            if (t < n) {
                left = mid;
                div = n - t;
            } else {
                right = mid;
                div = t - n;
            }
            if (div < 0.01)
                break;
        }
        mid *= 10;
        mid += 0.5;
        return (int) mid / 10d;
    }
}

全部评论

相关推荐

程序员小白条:排版,格式难顶,换个简洁的,保底offer没问题
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务