本文主要是介绍算法练习 - HJ107 求解立方根,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
求解立方根. 原题信息如下所示:
- 计算一个数字的立方根,不使用库函数
详细描述:- 接口说明
原型:
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.classpublic static double pow(double a, double b) {return StrictMath.pow(a, b); // default impl. delegates to StrictMath}### StrictMath.classpublic 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;}elsereturn b-a;}
Reference
[1]. java实现开根号算法
[2]. Java 求一个数的立方根
[3]. C语言pow()函数:求x的y次方的值
这篇关于算法练习 - HJ107 求解立方根的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!