int sqrt(int num){
int ret = 0;
int numBit[25];
int bitCount = 0;
while(num){
numBit[bitCount++] = num % 10;
num /= 10;
}
int remainder = numBit[--bitCount];
if (1 & bitCount){
remainder = remainder * 10 + numBit[--bitCount];
}
while(0 <= bitCount){
int tmpNum = 0;
while((20 * ret + tmpNum) * tmpNum <= remainder){
tmpNum++;
}
tmpNum--;
remainder = remainder - (20 * ret + tmpNum) * tmpNum;
ret = ret * 10 + tmpNum;
if (bitCount){
remainder = remainder * 10 + numBit[--bitCount];
remainder = remainder * 10 + numBit[--bitCount];
}else{
bitCount = -1;
}
}
return ret;
}
求 y 的开平方结果 x:
假设 a 是 x 的高位部分,b 是 x 的低位部分
则有 (a + b)^2 = y
展开 a^2 + 2ab + b^2 = y
b * (2a + b) = y - a^2
假设 ah 是 a 的最高位,bh是 b 的最高位
两边同时除以10n2有 bh * (2 * ah* 10 + bh) <= y/ (10n2) - ah^2