【问题标题】:Program for finding square root of number求数平方根的程序
【发布时间】:2016-03-27 03:10:45
【问题描述】:

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

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;
}

【问题讨论】:

  • “它给出了奇怪的结果”不是一个有效的问题。您需要更具体、更简洁。
  • 抱歉。我无法追踪更大数字上的预期输出和实际输出之间的关系,但这里有一些例子说明我在这些数字上得到的输出。
  • “无法追踪”?介意详细说明吗?
  • 这里是一些大数字的输出: 输入:7777777 输出:393225 输入:990000 输出:173384 输入:1000000 输出:458753。
  • @s_123 因为平方根更接近 1 而不是 x / 2,所以如果我们从左边开始尝试会更好,这样就不会出现溢出问题。你可以在第一步尝试g = 1,测试g * g(g+1) * (g+1)。如果不是正确的候选人,请使用g = (g + x / g) / 2 进行迭代。你可以看到有一个不变的g &lt;= sqrt(x),确保你不会通过正确的候选人。

标签: c++ c algorithm


【解决方案1】:

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

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

【讨论】:

  • 我也猜到了,因为这个 LONG_MAX 数字是 10 位数字,当数字是 5 位数字或更少时,我的程序似乎可以正常工作。
  • @s_123:LONG_MAX 因平台而异,但必须至少为 2147483647 (2^31-1)。另一个常见的值是 9223372036854775807 (2^63-1)。
  • 是的..好像我的是前一个。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多