当前位置:   article > 正文

69.x的平方根(c++实现)_采用c++编写代码计算非负整数的算术平方根

采用c++编写代码计算非负整数的算术平方根

 

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

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

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

初看题目时,我 只觉得是一头雾水。不过这是一道二分查找的拓展题,那么首先考虑利用二分查找的方法来解决问题。

首先我们了解完条件之后,观察一下输出和输入,大致分为以下四种情况:

1.当x=0时,k(输出值)=0;

2.当x=1时,k=1;

3.当x=2时,k=1,2的算术平方根约为1.4;

4.当x=4时,k=2,算数平均根是个整数。

自然就想起了题目的另外一个要求:输出一个整数舍弃小数部分,根据以上四种结果,我们可以发现输出的值的平方小于等于x也就是输入的值。即使第一二情况特殊(输出值等于输入值),我们得到一种规律便是k*k<=x。也就是我们二分查找的边界条件,同时也进行了比较。

因此我对二分查找有了更深刻的理解,二分查找有 查找 也有 比较。

这是代码(不知道为什么一直超时,后续我会修改)

  1. class Solution {
  2. public:
  3. int mySqrt(int x) {
  4. int left = 0;
  5. int right = x;
  6. int middle = left + (right - left) / 2;
  7. int result = -1;
  8. while(left <= right){
  9. if(middle * middle <= x){
  10. result = middle;
  11. left = middle + 1;
  12. }else {
  13. right = middle -1;
  14. }
  15. }
  16. return middle;
  17. }
  18. };

接下来是我看了题解得出的第二个方法:牛顿迭代法

简单介绍一下:给定一个初始值x0,函数f(x),进而得到导数f‘(x)。 

f(x)过定点A(x0,f(x0))过定点A作直线y-f(x0)=f’(x0)(x-x0),令y得0得x1的值,如此这样,当xi+1-xi的绝对值小于误差时得到xi+1为f(x)零点。

本题中可以将f(x)= x*2 + x0(输入的x)

关系式为x1 = (x0 + x / x0) / 2;

  1. class Solution {
  2. public:
  3. int mySqrt(int x) {
  4. int abs(double c){ //x是所需要转化绝对值的数
  5. if(c > 0){
  6. return c;
  7. }
  8. if(c < 0){
  9. return -c;
  10. }
  11. return 0;
  12. }
  13. if (x == 0){
  14. return 0; //当值为0的时候
  15. }
  16. double x0 = x;
  17. double x1 = (x0 + x / x0) / 2;
  18. while(abs(x1 - x0) > 0.00001){//假设误差为0.00001
  19. x0 = x1;
  20. x1 = (x0 + x / x0) / 2;
  21. }
  22. return x1;
  23. }
  24. };

这就是leetcode69题,也有我的一些收获,希望你看完也能有所收获,每天更新题解。

一天一个脚印,我是老猪,明天见!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/164765?site
推荐阅读
相关标签
  

闽ICP备14008679号