欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求解立方根

程序员文章站 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;
}

 

相关标签: 华为机试-牛客网