题解 | #求解立方根#
求解立方根
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)); } } }