【问题标题】:Square Root in C/C++C/C++ 中的平方根
【发布时间】:2015-07-18 16:52:45
【问题描述】:

我正在尝试实现我自己的平方根函数,它只给出平方根的整数部分,例如3 的平方根 = 1。

看到here的方法,尝试实现方法

 int mySqrt(int x)
 {
    int n = x;
    x = pow(2, ceil(log(n) / log(2)) / 2);
    int y=0;

    while (y < x)
    {
        y = (x + n / x) / 2;
        x = y;
    }

    return x;

}

上述方法对于输入 8 失败。另外,我不明白为什么它应该有效。

另外,我尝试了here的方法

int mySqrt(int x)
{

    if (x == 0) return 0;
    int x0 = pow(2, (log(x) / log(2))/2) ;
    int y = x0;
    int diff = 10;

    while (diff>0)
    {
        x0 = (x0 + x / x0) / 2; diff = y - x0;
        y = x0;
        if (diff<0) diff = diff * (-1); 

    }

    return x0;

}

在第二种方式中,对于输入 3,循环继续...无限期地进行(x0 在 1 和 2 之间切换)。

我知道这两种方法本质上都是 Netwon 方法的版本,但我无法弄清楚为什么它们在某些情况下会失败,以及如何让它们适用于所有情况。我想我在实施中有正确的逻辑。我调试了我的代码,但我仍然找不到让它工作的方法。

【问题讨论】:

  • C++ 不是 C 也不是 Java。
  • 您将结果存储在整数变量中,您希望在这里发生什么?
  • 如果我是你,我会调试代码或打印每个操作成员的结果值,例如cout &lt;&lt; log(n);
  • @adrian008 std::powstd::logstd::ceil 都不是整数运算。它们都在浮点数学方面工作,这意味着所有的不准确性(尤其是截断浮点 - 整数转换)......
  • 您已经有三个关于同一主题的 cmets:当大多数操作返回 floatdouble 时,您将数据存储在 int 中。这就是整个问题。

标签: c++ math square-root


【解决方案1】:

这个对我有用:

uintmax_t zsqrt(uintmax_t x)
{
    if(x==0) return 0;
    uintmax_t yn = x; // The 'next' estimate
    uintmax_t y = 0; // The result
    uintmax_t yp; // The previous estimate
    do{
        yp = y;
        y = yn;
        yn = (y + x/y) >> 1; // Newton step
    }while(yn ^ yp); // (yn != yp) shortcut for dumb compilers
    return y;
}

返回floor(sqrt(x))

不要用一个估计来测试 0,而是用 2 个估计来测试。

当我写这篇文章时,我注意到结果估计有时会波动。这是因为,如果确切的结果是分数,则算法只能在两个最接近的值之间跳转。因此,在下一个估计值与上一个估计值相同时终止将防止无限循环。

【讨论】:

  • 这似乎可以解释一下。
  • @defube 你的算法有效,我有直觉,非常感谢 :)。
  • @defube 另外,你认为这个问题好吗?在我看来,这很重要。
  • @defube 另外请解释为什么你返回 y 而不是 yn。
  • @adrian008:yn 在循环条件之前更新后,如果循环终止,y 仍然保持正确的值。
【解决方案2】:

试试这个

int n,i;//n is the input number
 i=0;
 while(i<=n)
 {
    if((i*i)==n)
    {
        cout<<"The number has exact root : "<<i<<endl;
    }
    else if((i*i)>n)
    {
        cout<<"The integer part is "<<(i-1)<<endl;
    }
    i++;
 }

希望这会有所帮助。

【讨论】:

  • 这不是 OP 要求的...这是 Java,而不是 C++。
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多