求根题(二分查找型)

1.整数求平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

* 0 <= x <=  2^{31} - 1

分析:1.当x \in [0,3 ] 时可以直接输出结果 ,而当x >= 4时整数的平方根都小于等于它的 一半,

所以 我们可以在    [1,x/2]  间进行二分查找的操作

代码如下:

if( x <= 1 )
   return x;
else
{
  if(x <= 3)
   return 1;
  int l = 1, r = x / 2;
  while(l <= r)
  {
     int mid = l + ((r - l) >> 1);
      if(mid == x/mid) //防止溢出
         return mid;
      else if(mid < x/mid)
            l = mid + 1;
      else if(mid > x/mid)
            r = mid - 1;
  }
 return r;

下面解释为什么最后 return right;

由题意我们可以得到:该题为向下取整,最后结束时显然 r < l,故 return right

官方标准答案:


    int mySqrt(int x) {
        if (x == 1) return 1;
        int min = 0;
        int max = x;
        while(max - min > 1){
            int m = (min + (max - min)/2);
            if (x/m < m){
                max = m;
            }else{
                min = m;
            }
        }
        return min;
    }

2.浮点数求平方根

   给你一个 非负数 x ,计算并返回 x 的 算术平方根,精确到 10^{-6};x≤10000

  这个与上面最大的不同就是x \in(0,1)时,平方根会大于等于 1,

  于是我们可以考虑一个新的二分区间:0~ 10000;

double l = 0 , r = 10000;
while(r - l > 1e-8)
 {
    double mid = l + (r - l)/2;
    if(mid*mid <= n)
       l = mid;
    else
       r = mid;
 }
  return l;

 返回 l ,因为都一样......

3.浮点数求立方根

给定一个浮点数 n,求它的三次方根。

注意,结果保留 6 位小数;

−10000≤n≤10000

代码:

#include <iostream>
using namespace std;
double pow(double n)
{
    double l = -10000 , r = 10000;
    while(r - l > 1e-8)
    {
        double mid = l + ((r - l)/2);
        if(mid*mid*mid <= n)
            l = mid;
        else
            r = mid;
    }
    return l;
}
int main()
{
    double n;
    cin >> n;
    printf("%lf" , pow(n));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值