Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算平方根c++; 我正在制作一个C++程序来计算一个数的平方根。此程序不使用“sqrt”数学内置操作。有两个变量,一个用于用户输入的数字,另一个用于该数字的平方根。这项计划效果不佳,我相信有更好的办法:_C++ - Fatal编程技术网

计算平方根c++; 我正在制作一个C++程序来计算一个数的平方根。此程序不使用“sqrt”数学内置操作。有两个变量,一个用于用户输入的数字,另一个用于该数字的平方根。这项计划效果不佳,我相信有更好的办法:

计算平方根c++; 我正在制作一个C++程序来计算一个数的平方根。此程序不使用“sqrt”数学内置操作。有两个变量,一个用于用户输入的数字,另一个用于该数字的平方根。这项计划效果不佳,我相信有更好的办法:,c++,C++,这是我的完整代码: #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 * squareroo

这是我的完整代码:

#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;
 }
#包括
使用名称空间std;
int main(){
int平方根=0;
整数;
库特数;
while(平方根*平方根!=数字){
平方根+=0.1;
}

cout以下是整数平方根计算的解释:

在数论中,正数的整数平方根 整数n是正整数m,它是最小的最大整数 大于或等于n的平方根

您开始的方法很好,但需要进行几次修正才能使其生效:

  • 您使用的是
    int
    您希望将1添加到
    平方根
    而不是0.1

  • 平方根*平方根
    等于或大于
    数字
    时,您希望停止计算。如果数字是26,则没有一个整数将自身乘以26

  • 在数字等于26的情况下,您想返回5还是6?在
    while
    循环之后,
    平方根的值将是6,因此您可能希望将其反转为5(如果
    平方根*平方根
    不同于
    数字

  • 下面是示例:

    #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;
    }
    
    #包括
    使用名称空间std;
    int main(){
    int平方根=0;
    整数;
    库特数;
    while(平方根*平方根<数字){
    平方根+=1;
    }
    如果(平方根*平方根!=数字)——平方根;
    
    cout以下是整数平方根计算的解释:

    在数论中,正数的整数平方根 整数n是正整数m,它是最小的最大整数 大于或等于n的平方根

    您开始的方法很好,但需要进行几次修正才能使其生效:

  • 您使用的是
    int
    您希望将1添加到
    平方根
    而不是0.1

  • 平方根*平方根
    等于或大于
    数字
    时,您希望停止计算。如果数字是26,则没有一个整数将自身乘以26

  • 在数字等于26的情况下,您想返回5还是6?在
    while
    循环之后,
    平方根的值将是6,因此您可能希望将其反转为5(如果
    平方根*平方根
    不同于
    数字

  • 下面是示例:

    #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;
    }
    
    #包括
    使用名称空间std;
    int main(){
    int平方根=0;
    整数;
    库特数;
    while(平方根*平方根<数字){
    平方根+=1;
    }
    如果(平方根*平方根!=数字)——平方根;
    
    cout如果A不是完美平方,此函数将计算平方根的下限。此函数基本上使用二进制搜索。您事先知道的两件事是,一个数字的平方根将小于或等于该数字,它将大于或等于1。因此,我们可以在该范围内应用二进制搜索。下面是我的实现。让我来看看如果您不理解代码中的任何内容,请了解。希望这对您有所帮助

    int sqrt(int A) {
        if(A<1)return 0;
        if(A==1)return 1;
    
        unsigned long long start,end,mid,i,val,lval;
        start = 1;
        end = A;
        while(start<=end){
            mid = start+(end-start)/2;
            val = mid*mid;
            lval = (mid-1)*(mid-1);
    
            if(val == A)return mid;     
            else if(A>lval && A<val) return mid-1;
            else if(val > A)end = mid;
            else if(val < A)start = mid+1;
        }
    }
    
    intsqrt(inta){
    
    如果(A如果A不是完美平方,此函数将计算平方根的下限。此函数基本上使用二进制搜索。您事先知道的两件事是,一个数字的平方根将小于或等于该数字,它将大于或等于1。因此,我们可以在该范围内应用二进制搜索。下面是我的实现。让我知道如果你不理解代码中的任何内容,希望这能有所帮助

    int sqrt(int A) {
        if(A<1)return 0;
        if(A==1)return 1;
    
        unsigned long long start,end,mid,i,val,lval;
        start = 1;
        end = A;
        while(start<=end){
            mid = start+(end-start)/2;
            val = mid*mid;
            lval = (mid-1)*(mid-1);
    
            if(val == A)return mid;     
            else if(A>lval && A<val) return mid-1;
            else if(val > A)end = mid;
            else if(val < A)start = mid+1;
        }
    }
    
    intsqrt(inta){
    
    如果(A此函数使用嵌套间隔(未测试),您可以定义精度:

    #include <math.h>
    #include <stdio.h>
    
    double mySqrt(double r) {
      double l=0, m;
      do {
         m = (l+r)/2;
         if (m*m<2) {
            l = m;
         } else {
            r = m;
         }
      } 
      while(fabs(m*m-2) > 1e-10);      
      return m;
    }
    
    #包括
    #包括
    双mySqrt(双r){
    双l=0,m;
    做{
    m=(l+r)/2;
    如果(m*m 1e-10);
    返回m;
    }
    

    请参见

    此函数使用嵌套间隔(未测试),您可以定义精度:

    #include <math.h>
    #include <stdio.h>
    
    double mySqrt(double r) {
      double l=0, m;
      do {
         m = (l+r)/2;
         if (m*m<2) {
            l = m;
         } else {
            r = m;
         }
      } 
      while(fabs(m*m-2) > 1e-10);      
      return m;
    }
    
    #包括
    #包括
    双mySqrt(双r){
    双l=0,m;
    做{
    m=(l+r)/2;
    如果(m*m 1e-10);
    返回m;
    }
    

    请参见

    代码的问题在于,只有当数字的平方根正好是N*0.1时,它才有效,其中N是整数,这意味着如果答案是1.4142而不是1.400000000,那么代码就会失败。有更好的方法,但它们都更复杂,并且使用数值分析来近似答案,这是最简单的方法这就是牛顿-拉斐逊方法

    您可以使用下面的函数,此函数使用牛顿-拉斐逊方法来查找根,如果您需要有关牛顿-拉斐逊方法的更多信息,请查看wikipedia文章。如果您需要更高的精度-但性能更差-您可以将“0.001”减少到您的模拟,或者如果您想要更好的性能但精度更低,则可以将其增加强迫症

    float mysqrt(float num)   {  
        float x = 1;
    
        while(abs(x*x - num) >= 0.001 )
            x = ((num/x) + x) / 2;
    
        return x;
    
    }  
    
    如果您不想导入
    math.h
    ,您可以编写自己的
    abs()

    浮动abs(浮动f){
    if(f<0)
    f=-1*f;
    返回f;
    }
    
    你的代码的问题是,只有当数字的平方根正好是N*0.1,其中N是一个整数,这意味着如果答案是1.4142而不是1.400000000,你的代码才会失败。有更好的方法,但它们都更复杂,并且使用数值分析来近似答案,这是最简单的方法ch是牛顿-拉斐逊方法

    您可以使用下面的函数,此函数使用牛顿-拉斐逊方法来查找根,如果您需要有关牛顿-拉斐逊方法的更多信息,请查看wikipedia文章。如果您需要更高的精度,但性能更差,则可以减少
    #include <iostream>
    using namespace std;
    int main()
    {
        double x = 1, average, s, r;
        cout << "Squareroot a Number: ";
        cin >> s;
        r = s * 2;
        for ( ; ; ) //for ; ; ; is to run the code forever until it breaks
        {
            average = (x + s / x) / 2;
            if (x == average)
            {
                cout << "Answer is : " << average << endl;
                return 0;
            }
            x = average;
        }
    }