题目描述
给定一个浮点数n,求它的三次方根。
输入格式
共一行,包含一个浮点数n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留6位小数。
数据范围
−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
观众老爷们,如果本思路对您有帮助,求关注一波~~~
思路
求解的思路采用二分,并且是浮点的二分,通过r - l > 1e-8边界判断
注意点:
1.左右边界值按照题目给的进行赋值即可
防止以下写法的出现
# l = 0 r = x
# x = 0.001 解为0.1 r - l在区间(0, 0.01) 显然无解
2.浮点二分,类型为longlong(C++) double/float(java) int(python默认类型)
double l = -10000, r = 10000;
while(r - l > 1e-8){
double mid = (l + r) / 2;
if(mid * mid * mid >= x) r = mid;
else l = mid;
}
java 代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
double x;
x = sc.nextDouble();
double l = -10000, r = 10000;
while(r - l > 1e-8){
double mid = (l + r) / 2;
if(mid * mid *mid >= x) r = mid;
else l = mid;
}
System.out.println(String.format("%.6f", l));
}
}
python 代码
def main():
x = float(input())
# 防止以下写法的出现
# l = 0 r = x
# x = 0.001 解为0.1 r - l在区间(0, 0.01) 显然无解
l = -10000
r = 10000
while (r - l > 1e-8):
mid = (l + r) / 2
# 经验 如果结果保留i位, 则误差保留i+2位
if (mid * mid * mid >= x):
r = mid
else:
l = mid
print("%.6f" %l)
main()
C++ 代码
#include <iostream>
using namespace std;
int main(){
double x;
cin >> x;
double l = -10000, r = 10000;
while(r - l > 1e-8){
double mid = (l + r) / 2;
if(mid * mid * mid >= x) r = mid;
else l = mid;
}
printf("%lf\n", l);
return 0;
}