LeetCode 69. x 的平方根

亦凉 2022-11-07 05:53 231阅读 0赞

69. x 的平方根

https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

  1. 输入: 4
  2. 输出: 2

示例 2:

  1. 输入: 8
  2. 输出: 2

说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。

题解

方法一:牛顿迭代法

下面这种方法可以很有效地求出根号 aa 的近似值:首先随便猜一个近似值 xx,然后不断令 xx 等于 xx 和 a/xa/x 的平均数,迭代个六七次后 xx 的值就已经相当精确了。

例如,我想求根号 22 等于多少。假如我猜测的结果为 44,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号 22 了:

( 4 + 2/ 4 ) / 2 = 2.25

( 2.25 + 2/ 2.25 ) / 2 = 1.56944…

( 1.56944…+ 2/1.56944…) / 2 = 1.42189…

( 1.42189…+ 2/1.42189…) / 2 = 1.41423…

….

如果所示:
在这里插入图片描述

在这里插入图片描述

代码

(ps:一开始不要脸的写了个math中的 sqrt函数 看了大佬写的题解,感觉几年数学白学 T^T)

  1. class Solution {
  2. public:
  3. int s;
  4. int mySqrt(int x) {
  5. s=x;
  6. if(x==0)
  7. return 0;
  8. return ((int)(Sqrt(x)));
  9. }
  10. double Sqrt(double x){
  11. double res=(x+s/x)/2;
  12. if(res==x)
  13. return x;
  14. else
  15. return Sqrt(res);
  16. }
  17. };

简写:

  1. int mySqrt(int a) {
  2. long x = a;
  3. while (x * x > a) {
  4. x = (x + a / x) / 2;
  5. }
  6. return x;
  7. }

方法二:二分法

在这里插入图片描述

  1. int mySqrt(int a) {
  2. if (a == 0)
  3. return a;
  4. int l = 1, r = a, mid, sqrt;
  5. while (l <= r) {
  6. mid = l + (r - l) / 2;
  7. sqrt = a / mid;
  8. if (sqrt == mid) {
  9. return mid;
  10. } else if (mid > sqrt) {
  11. r = mid - 1;
  12. } else {
  13. l = mid + 1;
  14. }
  15. }
  16. return r;
  17. }

发表评论

表情:
评论列表 (有 0 条评论,231人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode69 x平方根

    实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1:

    相关 LeetCode 69x平方根

    题目描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。