求解一个数的立方根(想不懂都难)

也不开学,只能自己找点事情干了。O(∩_∩)O

虽然周六还有一场考试,周五还有一个Presentation,周四还有一下午的实验,周三还有一上午的课,可是,我 都 不 想 干 ~

又不会做什么大事情,只能做点小题目来觉得自己没有闲着,干了大事情,难搞。/(ㄒoㄒ)/~~

牛客做题的第一天,只写了两道题,还看了别人的思路,脑子不在状态,写不出来自己的代码/(ㄒoㄒ)/~~

【前面这一大段废话是两周前写的,现在才来干正事,我真是个废物】

思路一:库函数

函数 pow(x,y) 是计算 x 的 y 次方,所以,令 y=1/3 即可求数 x 的立方根。

思路二:二分法

public static double getCubeRoot(double input)
{
    
    
	if(input==0||input==1||input==-1)
		return input;
	else
	{
    
    
		double min = 0;
	    double max = input;
	    double mid = 0;
	     // 注意,这里的精度要提高一点,否则某些测试用例无法通过
       while ((max - min) > 0.001) 
       {
    
    
           mid = (max + min) / 2;
           if (mid * mid * mid > input)
             max = mid;
           else if (mid * mid * mid < input)
	         min = mid;
	       else
	         return mid;
	    }
	         return max;//这种情况是:在满足精确度的条件下无精确值,选择max作为近似值来返回。
	         //同样也可以选择min作为近似值来返回
     }
}

我觉着这个代码还是很简单的,主要是理解二分法的思想:
在这里,是先把立方根的范围锁定在0-x(x是输入的值)。

mid=(min+max)/2;
然后让 mid 连续三次乘,结果为 y
然后比较 y 与 input 的关系。
如果y 大于 input 时,max=mid,范围缩小了一半;
如果y 小于 input 时,min=mid,范围缩也小了一半;
如果y 等于 input 时,代表 mid 就是数 input 的立方根,可直接返回。

思路三:牛顿迭代法

首先要先了解牛顿迭代法是什么:

假如输入 a ,求数 a 的立方根,那么 x^3-a=0 这个方程的解就是我们所求的。

而方程 f(x) 的牛顿迭代格式为:
在这里插入图片描述
所以,所求方程的牛顿迭代公式为:
在这里插入图片描述
了解了牛顿迭代法的内容,我们就可以来写代码了。

public static void main(String[] args) {
    
    
	double x,y,x1,x2;
	Scanner in = new Scanner(System.in);
	x = in.nextDouble();
	System.out.println("请手动输入一个初始近似值");
	x1 = in.nextDouble();
	in.close();
	x2= (x/x1/x1+2*x1)/3;    //牛顿迭代公式的第一次使用
	y = fun(x2,x);
	System.out.printf("%.1f",y);
}
public static double fun(double x2,double x)
{
    
    
	if(Math.abs(x2*x2*x2-x)<0.0000001) //递归的结束条件
		return x2;
	else
	   	return fun((x/x2/x2+2*x2)/3,x);//牛顿迭代公式的递归使用
}

OK,终于把这个在草稿箱里躺了两周的文章写完了。睡觉咯,晚安。

猜你喜欢

转载自blog.csdn.net/xiaobai_qian/article/details/106799134