69.x的平方根

  1. 69.x的平方根
    1. 69.1 题目
    2. 69.2 题解
      1. 二分查找法
      2. 牛顿迭代法
    3. 69.3 代码
    4. 69.4 运行结果

69.x的平方根


69.1 题目

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

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 2^31 - 1

69.2 题解

二分查找法

// 方法一:二分查找法
// 在1-x不断二分查找找到最接近的整数
static int MySqrt1(int x)
{
    // 如果 x 等于 0 或 1,直接返回 x,因为其平方根为自身
    if (x == 0 || x == 1)
    {
        return x;
    }

    // 初始化左边界为 1,右边界为 x,以及结果变量为 0
    long left = 1;
    long right = x;
    long result = 0;

    // 使用二分查找法寻找 x 的平方根
    while (left <= right)
    {
        // 计算中间值 mid
        long mid = left + (right - left) / 2;

        // 如果 mid 的平方等于 x,直接返回 mid
        if (mid * mid == x)
        {
            return (int)mid;
        }
        // 如果 mid 的平方小于 x,说明平方根在右半部分,更新左边界和记录结果的变量
        else if (mid * mid < x)
        {
            left = mid + 1;
            result = mid; // 记录当前 mid,因为要返回整数部分
        }
        // 如果 mid 的平方大于 x,说明平方根在左半部分,更新右边界
        else
        {
            right = mid - 1;
        }
    }

    // 返回整数部分结果
    return (int)result;
}

牛顿迭代法

// 方法二:牛顿迭代法
// 思路:牛顿迭代法用于逼近方程的根,对于求解平方根问题,迭代公式为 r = (r + x / r) / 2。
// 1. 选择初始值 r 为 x。
// 2. 使用迭代公式逐步逼近 x 的平方根,直到 r * r 不再大于 x。
// 3. 返回整数部分结果,即 r 的整数部分。
static int MySqrt2(int x)
{
    // 如果 x 等于 0 或 1,直接返回 x,因为其平方根为自身
    if (x == 0 || x == 1)
    {
        return x;
    }

    // 初始化变量 r 为 x
    long r = x;

    // 使用牛顿迭代法逼近 x 的平方根
    while (r * r > x)
    {
        r = (r + x / r) / 2;
    }

    // 返回整数部分结果
    return (int)r;
}

69.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
        // 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
        // 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

        // 示例 1:
        // 输入:x = 4
        // 输出:2

        // 示例 2:
        // 输入:x = 8
        // 输出:2
        // 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

        // 提示:
        // 0 <= x <= 231 - 1

        #endregion

        #region 测试

        // 示例 1
        int x1 = 4;
        int result1 = MySqrt1(x1);
        Console.WriteLine($"示例1 方法1 输出:{result1}");
        int result1_2 = MySqrt2(x1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        int x2 = 8;
        int result2 = MySqrt1(x2);
        Console.WriteLine($"示例2 方法1 输出:{result2}");
        int result2_2 = MySqrt2(x2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        #endregion
    }

    #region 答案

    // 方法一:二分查找法
    // 在1-x不断二分查找找到最接近的整数
    static int MySqrt1(int x)
    {
        // 如果 x 等于 0 或 1,直接返回 x,因为其平方根为自身
        if (x == 0 || x == 1)
        {
            return x;
        }

        // 初始化左边界为 1,右边界为 x,以及结果变量为 0
        long left = 1;
        long right = x;
        long result = 0;

        // 使用二分查找法寻找 x 的平方根
        while (left <= right)
        {
            // 计算中间值 mid
            long mid = left + (right - left) / 2;

            // 如果 mid 的平方等于 x,直接返回 mid
            if (mid * mid == x)
            {
                return (int)mid;
            }
            // 如果 mid 的平方小于 x,说明平方根在右半部分,更新左边界和记录结果的变量
            else if (mid * mid < x)
            {
                left = mid + 1;
                result = mid; // 记录当前 mid,因为要返回整数部分
            }
            // 如果 mid 的平方大于 x,说明平方根在左半部分,更新右边界
            else
            {
                right = mid - 1;
            }
        }

        // 返回整数部分结果
        return (int)result;
    }

    // 方法二:牛顿迭代法
    // 思路:牛顿迭代法用于逼近方程的根,对于求解平方根问题,迭代公式为 r = (r + x / r) / 2。
    // 1. 选择初始值 r 为 x。
    // 2. 使用迭代公式逐步逼近 x 的平方根,直到 r * r 不再大于 x。
    // 3. 返回整数部分结果,即 r 的整数部分。
    static int MySqrt2(int x)
    {
        // 如果 x 等于 0 或 1,直接返回 x,因为其平方根为自身
        if (x == 0 || x == 1)
        {
            return x;
        }

        // 初始化变量 r 为 x
        long r = x;

        // 使用牛顿迭代法逼近 x 的平方根
        while (r * r > x)
        {
            r = (r + x / r) / 2;
        }

        // 返回整数部分结果
        return (int)r;
    }
    

    #endregion
}

69.4 运行结果

示例1 方法1 输出:2
示例1 方法2 输出:2
示例2 方法1 输出:2
示例2 方法2 输出:2


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏