求解立方根
程序员文章站
2024-03-22 23:13:40
...
题目描述
计算一个数字的立方根,不使用库函数。
保留一位小数。
输入描述:
待求解参数,为double类型(一个实数)
输出描述:
输入参数的立方根。保留一位小数。
示例1
输入
复制
216
输出
复制
6.0
思路:二分答案即可,需要注意的坑:
1. 有可能是负数区间
2. 当数的绝对值小于1时,右边界应设置为1,否则会得不到答案,因为小于1的数只会越乘越小,如待求解数为0.8,0.9*0.9*0.9 = 0.729,此时如果我们设置有边界为0.8,那么最大也就能得到0.8,显然不正确
3. 输出格式要求比较严格,在具有整数部分的时候只保留小数点后一位;当只有小数部分的时候,需要保留一位有效数字
#include<bits/stdc++.h>
using namespace std;
int main(){
double num, L = 0 , R, M;
bool isNegative = false, hasNumBeforePoint = false;
stringstream sstream;
string strResult;
cin >> num;
if(num < 0){
num = -num;
isNegative = true;
}
R = num > 1 ? num : 1;
while(fabs(L - R) > 1e-4){
//cout << "L:" << L << " R:" << R << endl;
M = (L + R) / 2;
if(M * M * M < num){
L = M;
}else{
R = M;
}
}
sstream << L;
sstream >> strResult;
int i;
for(i = 0 ; i < strResult.length() && strResult[i] != '.'; ++ i){
if(strResult[i]!= '0'){
hasNumBeforePoint = true;
}
}
if(hasNumBeforePoint){
cout << (isNegative ? "-" : "") << round(L * 10) / 10 << endl;
return 0;
}else{
int c, k = 1;
for(c = 1; strResult[i + c] == '0'; ++ c);
while(c --) k *= 10;
cout << (isNegative ? "-" : "") << round(L * k) / k << endl;
}
return 0;
}