https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca?tpId=37&tqId=21330&tPage=6&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking
不使用库函数,计算一个浮点数的立方根,要求返回的立方根也是浮点数,并且只保留一位小数位
先得到最后一个立方小于等于input的整数,然后再一次次加0.1,找到第一个立方大于input的浮点数 i,然后根据情况打印 i 或者 (i-0.1)即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
double input = sc.nextDouble();
double i = 0.0;
for (i=0; i input) {
break;
}
}
while (i*i*i <= input) {
i += 0.1;
}
//取与input相差最小的那一个
if (Math.abs((i-0.1)*(i-0.1)*(i-0.1)-input) < Math.abs(i*i*i-input)) {
System.out.println(String.format("%.1f", i-0.1));
} else {
System.out.println(String.format("%.1f", i));
}
}
}
}
上面的问题等价于令f(x) = x^3 - y,求解f(x) = x^3 - y = 0,根据泰勒公式有f(x) = f(x0) + f'(x0)(x - x0) = (x0^3) - y + 3(x0^2)(x-x0) = 0,所以有 x = x0 - (x0^3 - y) / 3(x0^2)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
double ret = 1.0;
while (Math.abs(ret*ret*ret-input) > 1e-9) {
ret = ret - ((ret*ret*ret-input) / (3*ret*ret));
}
System.out.printf("%.1f", ret);
}
}
同理求解平方根也是如此,f(x) = x^2-y,求解f(x)=x^2-y=0.用泰勒公式展开为f(x)=f(x0)+f'(x0)(x-x0)=x0^2-y+2x0*(x-x0)=0,所以有x=(x0+y/x0) / 2。