寻找数字平方根的程序

时间:2016-03-27 03:10:45

标签: c++ c algorithm

所以我写了一个程序,找到一个数字的平方。对于较小的数字似乎工作正常,但对于长数字,它会产生奇怪的结果。这是我的代码。

int SquareRoot(long x)
{
  long start=1;
  long end=x;
  long mid;

  while(start<end)
  {
     mid=start+(end-start+1)/2;
     if(mid*mid<x)
     {
        if((mid+1)*(mid+1)>x)
        {
            return mid;
        }
       start=mid;
     }
     else if(mid*mid>x)
     {

         if((mid-1)*(mid-1<x)
            return mid-1;
        end=mid;
    }
    else
        return mid;
  }
  return start;
}

1 个答案:

答案 0 :(得分:3)

可能是&#34;奇怪的结果&#34;当一个或两个计算mid * mid(mid + 1) * (mid + 1)溢出时会发生这种情况,这会在end大于2*sqrt(LONG_MAX)时发生(如果long是大约6,074,000,998,则会发生这种情况如果long是32位,则为64位或92680。

溢出将导致与x的比较产生错误的结果(从技术上讲,溢出会产生未定义的行为,尽管gcc的结果是可预测但不正确的。)