0
夹逼法==二分法
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
double input = in.nextDouble();
double a =(double)Math.round(getCubeRoot(input)*10)/10;
System.out.println(a);
}
public static double getCubeRoot(double input){
double left = 0;
double right = input;
double mid=0;
if(input==0){
return 0;
}else if(input<0){
return -getCubeRoot(-input);
}else{
while(right -left >0.01){
mid = (right+left)/2;
if(mid*mid*mid>input){
right = mid;
}else{
left = mid;
}
}
return mid;
}
}
}
发表于 2020-03-10 16:59:50
回复(0)
更多回答
102
牛顿迭代法。设f(x)=x3-y, 求f(x)=0时的解x,即为y的立方根。
根据牛顿迭代思想,xn+1=xn-f(xn)/f'(xn)即x=x-(x3-y)/(3*x2)=(2*x+y/x/x)/3;
#include
inline double abs(double x){return (x>0?x:-x);}
double cubert(const double y){
double x;
for(x=1.0;abs(x*x*x-y)>1e-7;x=(2*x+y/x/x)/3);
return x;
}
int main(){
for(double y;~scanf("%lf",&y);printf("%.1lf\n",cubert(y)));
return 0;
}
编辑于 2016-08-12 13:43:08
回复(25)
29
import java.util.*;
public class Main
{
// 使用二分查找算法
public static double getCubeRoot(double input)
{
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;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext())
{
double input = sc.nextDouble();
double result = getCubeRoot(input);
System.out.printf("%.1f\n", result);
}
sc.close();
}
}
发表于 2016-08-12 15:20:51
回复(17)
21
命f(x) = x^3 - a,求解f(x) = x^3 - a = 0。
利用泰勒公式展开,即f(x)在xo处的函数值为:
f(x) = f(xo) +f'(xo)(x-xo) = xo^3-a+3xo^2(x-x0) = 0,
解之得:x = xo - (xo^3 - a) / (3xo^2)。 #include
#include
double fun(double n) {
double x = 1.0;
while(fabs(x*x*x - n) > 1e-9)
x = x - ((x*x*x - n) / (3*x*x));
return x;
}
int main() {
int number;
scanf("%d", &number);
double ans = fun(number*1.0);
printf("%.1f", ans);
return 0;
}
求平方根用一个套路@_@:
命f(x) = x^2 - a,求解f(x) = x^2 - a = 0。