我正在制作一个C++程序来计算数字的平方根。该程序不使用内置的“sqrt”数学运算。有两个变量,一个用于用户输入的数字,另一个用于该数字的平方根。该程序不能很好地运行,我相信有更好的方法可以做到:

这是我的完整代码:

#include <iostream>
using namespace std;

int main(){
  int squareroot = 0;
  int number;

  cout << "enter a number sp that i can calculate its squareroot" << endl;

  cin >> number;

  while (squareroot * squareroot != number){

      squareroot+=0.1;

}
cout << "the square root is" << squareroot << endl;
return 0;
 }

我知道一定有更好的方法。请帮助。通过Google浏览,但由于我还是个初学者,所以不了解那里的复杂程序。

提前致谢。

最佳答案

以下是整数平方根计算的说明:



您开始的方法不错,但是需要进行一些更正才能使其起作用:

  • 您正在使用int,但要在squareroot中添加1,而不是0.1
  • 您想在squareroot * squareroot等于或大于number时停止计算
  • 。考虑一下数字是26的情况,您没有一个自身会乘以26的整数。
  • 对于数字等于26的
  • ,您要返回5还是6?在while循环之后,squareroot的值将为6,因此您可能需要将其反转为5(如果squareroot * squarerootnumber不同)

  • 下面的例子:
    #include <iostream>
    using namespace std;
    
    int main(){
      int squareroot = 0;
      int number;
    
      cout << "enter a number sp that i can calculate its squareroot" << endl;
    
      cin >> number;
    
      while (squareroot * squareroot < number){
          squareroot+=1;
      }
    
      if (squareroot * squareroot != number) --squareroot;
    
      cout << "the square root is" << squareroot << endl;
      return 0;
    }
    

    下面是一种使用二进制搜索原理计算平方根的更有效,更优雅的方法。 O(log(n))
    int mySqrt(int x) {
        if (x==0) return 0;
        int left = 1;
        int right = x/2 + 1;
        int res;
    
        while (left <= right) {
            int mid = left + ((right-left)/2);
            if (mid<=x/mid){
                left = mid+1;
                res=mid;
            }
            else {
                right=mid-1;
            }
        }
    
        return res;
    }
    

    09-27 22:56