我正在尝试实现我自己的平方根函数,它只给出平方根的整数部分,例如平方根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方法的版本,但我无法弄清楚在某些情况下它们失败的原因,我怎么能让它们适用于所有情况。我想我在实现中有正确的逻辑。我调试了我的代码,但仍然找不到让它工作的方法。
答案 0 :(得分: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个估计值进行测试。
当我写这篇文章时,我注意到结果估计有时会发生变化。这是因为,如果确切结果是分数,则算法只能在两个最接近的值之间跳转。因此,当下一个估计值与前一个估计值相同时终止将阻止无限循环。
答案 1 :(得分:0)
试试这个
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++;
}
希望这有帮助。