前言
求解立方根. 原题信息如下所示:
- 计算一个数字的立方根,不使用库函数
详细描述:- 接口说明
原型:
public static double getCubeRoot(double input)
输入:double 待求解参数
返回值:double 输入参数的立方根,保留一位小数- 输入描述: 待求解参数 double类型
输出描述: 输入参数的立方根 也是double类型- 示例1
输入 216
输出 6.0
(牛客网 - HJ107) 求解立方根
解析
求立方根.
- 工具法.
我们可以使用Math
工具类的函数.pow(double,double)
,pow(double, 1.0/3.0)
.值得注意的是, 不能写成1/3
. (因为1/3
都是整数类型, 会被认为是0.)
工具类如何实现?Native方法. 线索已断.
### Math.class
public static double pow(double a, double b) {
return StrictMath.pow(a, b); // default impl. delegates to StrictMath
}
### StrictMath.class
public static native double pow(double a, double b);
- 非工具法. 牛顿迭代法.
类似微积分的思想. 详情请看:
如何通俗易懂地讲解牛顿迭代法?
1.3求根之牛顿迭代法
最后具体的编程思路为, 使用如下公式进行计算. (具体的如何实现, 我还是摸不清头脑. yysy. 这个我们以后再进行深究吧.)
import java.util.*;
import java.text.DecimalFormat;
public class Simple {
// 牛顿迭代法
public static double getLiFangGen(double num) {
if (num == 0) {
return num;
}
double num1,num2;
num1 = num;
num2 = (2*num1/3)+(num/(num1*num1*3));//利用牛顿迭代法求解
while(Math.abs(num2-num1)>0.000001){
num1=num2;
num2=(2*num1/3)+(num/(num1*num1*3));
}
DecimalFormat df = new DecimalFormat("#.0");
return Double.parseDouble(df.format(num2));
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
double input = sc.nextDouble();
System.out.println(getLiFangGen(input));
}
}
# 求平方根.
public static double SqrtByNewton(double target,double eps){
double Xa=target,Xb;
do {
Xb = Xa;
Xa = (Xa+target/Xa)/2;
} while (fabsf(Xa,Xb)>eps);
return Xa;
}
public static double fabsf(double a,double b){
if(a>b){
return a-b;
}else
return b-a;
}
Reference
[1]. java实现开根号算法
[2]. Java 求一个数的立方根
[3]. C语言pow()函数:求x的y次方的值