题解 | #求解立方根#

求解立方根

https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca?tpId=37&tqId=21330&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D3%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

这里给出一种取巧的办法,其实在解决问题时除了考虑寻求通解以外,我们还可以着眼于问题本身。

题目中的数据范围为∣val∣≤20 ,可以发现val本身范围为[-20,20],可以直接先通过穷举列出该范围内所有的一位小数(x.x)的立方值。

对于需要求解的值x(除开边界值),在[-20,20]中,一定能找到两个数a,b满足a<=x*x*x<=b,此时只需要考虑a,b二者中谁更加接近x*x*x,其对立的立方根就是所求的值。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextDouble()) {
            double a = in.nextDouble();

            TreeMap<Double, Double> map = new TreeMap<>();
            double b = 0.0;
            while (b * b * b <= 20) {
                map.put(b * b * b, b);
                b += 0.1;
            }
            b = 0.0;
            while (b * b * b >= -20) {
                map.put(b * b * b, b);
                b -= 0.1;
            }
            Double c1 = map.floorKey(a);
            Double c2 = map.ceilingKey(a);
            if (c2 == null)
                System.out.printf("%.1f%n", map.get(c1));
            else if (c1 == null)
                System.out.printf("%.1f%n", map.get(c2));
            else if (Math.abs(c1 - a) < Math.abs(c2 - a))
                System.out.printf("%.1f%n", map.get(c1));
            else
                System.out.printf("%.1f%n", map.get(c2));
        }
    }
}
全部评论

相关推荐

01-17 12:35
吉首大学 Java
秋招之BrianGriffin:自己的工作自己做!😡
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务