观察十进制的情况
数值(a) 位数(m) 正整数平方根(b) 正整数平方根位数(n)
1 1 1 1
99 2 9 1
100 3 10 2
999 3 31 2
10000 5 100 3
...
结论:n = ( m + 1 ) / 2
对于二进制同样有效
算法思路:
(0). 计算出正整数的二进制(补码,为其本身)的最高位(第一个不是0的位);
(1). 取正整数的二进制值长度(奇数按+1计算)的一半:
最小值(计算起点)为首位为1其它位为0的数;
最大值为所有位都是1的数(视算法而定,如果用折半查找可以需要引入最大值)
(2). 通过循环,找出最小值和最大值之间符合条件的数( b^2<=a&&(b+1)^2>a )
改进想法:
结合折半查找减少运算次数;
最大值的计算:
int maxnumber = 1;
for ( int i = 0; i < 位数; i++ )
maxnumber += 1 << i;
时间有限,未深究,欢迎补充和完善,或者提出更好的办法
一种计算正整数平方根的方法
最新推荐文章于 2024-07-04 23:07:35 发布