算法1基于位操作,其基本思想类似于人类手动计算开平方的过程。我们将待开平方的数字拆分为二进制形式。设x是待开平方的数,x=10*p+q,其中p是已知部分,q是未知部分。通过公式q=(x^2-100*p^2)/(20*p+q)来迭代求解q。在二进制下,公式简化为q=(x^2-4*p^2)/(4*p+q)。算法的核心是不断地调整q的值,使得余数最小,直至找到最接近的q值。在C语言中,可以编写如下程序:
```c
unsigned short sqrt(unsigned long a){
unsigned long rem = 0;
unsigned long root = 0;
unsigned long pisor = 0;
for(int i=0; i<16; i++){
root <<= 1;
rem = ((rem << 2) + (a >> 30));
a <<= 2;
pisor = (root<<1) + 1;
if(pisor <= rem){
rem -= pisor;
root++;
}
}
return (unsigned short)(root);
}
|