• 数的三次方根


    #include
    #include
    using namespace std;
    double n,l,r,mid;
    bool flag;
    double q(double a){return aaa;}
    int main(){
    cin>>n;
    l=-10000,r=10000;
    while(r-l>=1e-7){
    mid=(l+r)/2;
    if(q(mid)>=n) r=mid;
    else l=mid;
    }
    cout< return 0;
    }
    根据视频整理, 结合视频理解效果更佳

    浮点数二分模板
    浮点数二分的本质也是边界, 唯一区别是浮点数没有整除, 区间长度可以严格的缩小一半

    当区间长度足够小时, 便可以认为是一个数

    模板
    double bsearch(double l, double r) {
    const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求, 一般比所求精度高 2
    while (r - l > eps) {
    double mid = (l + r) / 2;
    if (check(mid)) r = mid;
    else l = mid;
    }
    return l;
    }
    题目解答
    方法一
    注意 r - l的取值与所求答案要求精度, 一般比要求高的 2

    对正负数进行转换

    代码一
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double n = in.nextDouble();

        double l = 0, r = Math.abs(n);  // 考虑 n为负数的情况
    
        while (r - l > 1e-8) {  // // 精度比所求精度高 2位
            double mid = (l + r) / 2;
            if (mid * mid * mid >= Math.abs(n))   // 不需要考虑边界问题
                r = mid;
            else
                l = mid;
        }
        if (n >= 0)
            System.out.println(String.format("%.6f", l)); // 保留 6位小数
        else
            System.out.println("-" + String.format("%.6f", l));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    }
    题目给出了查找范围, 直接在范围中进行查找

    代码二
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double target = in.nextDouble();

        double l = -10000, r = 10000;
        while (r - l > 1e-8) {      // 精度比所求精度高 2位
            double mid = (l + r) / 2;
            if (mid * mid * mid >= target)     // 左边
                r = mid;        // 不需要进行 +1或者 -1
            else
                l = mid;
        }
        System.out.println(String.format("%.6f", l)); // 保留 6位小数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    }
    方法二
    在 100循环中进行寻找

    代码三
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double n = in.nextDouble();

        double l = 0, r = Math.abs(n);  // 考虑 n为 负数的情况
    
        for(int i = 0; i < 100; i++) {  // 在 100次中进行寻找
            double mid = (l + r) / 2;
            if (mid * mid * mid >= Math.abs(n))   // 不需要考虑边界问题
                r = mid;
            else
                l = mid;
        }
        if (n >= 0)
            System.out.println(String.format("%.6f", l)); // 保留 6位小数
        else
            System.out.println("-" + String.format("%.6f", l));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    }

  • 相关阅读:
    外汇天眼:ADSS已与analytics KX供应商就合作达成一致
    CF803F
    Hadoop原理与技术——Hbase的基本操作
    Qt接收串口字节数据并存储
    代码随想录训练营二刷第五十二天 | 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
    Tomcat部署及优化
    java基础10题
    记一次 .NET某酒店后台服务 卡死分析
    Redis 数据迁移篇之redis-shake工具使用手册
    6 个意想不到的 JavaScript 问题
  • 原文地址:https://blog.csdn.net/m0_63185171/article/details/126917562