欢迎光临散文网 会员登陆 & 注册

整数开平方算法学习记录

2022-10-21 10:14 作者:SpriteSword  | 我要投稿

        之前同学问我一段代码。本来我也不懂,就去查了一下,又没睡着午觉连想了大概5小时,终于想通了。此文纪念一下那个头脑发热的中午。

        这是那段代码。

        《平方根的C语言实现(二) —— 手算平方根的原理》(https://www.cnblogs.com/Colin-Cai/p/7220506.html)这篇的思想跟我看到的代码的思想是一样的,于是我认真学习了一下。

        计算方法原来从完全平方公式里来的

(aN%20%2B%20b)%5E2%3D(aN)%5E2%20%2B%202aNb%20%2B%20b%5E2%20%3D%20(aN)%5E2%20%2B%20b(2aN%2Bb)

b 其实是开方结果的最低位,这一轮计算中要算的;a 是开方结果的第2位到最高位,是上一轮计算的结果;N 是进制数。

        整个计算过程就是

%E4%BD%99%E6%95%B0%3Dm-(aN)%5E2%20%5Cgeq%20b(2aN%2Bb)

粗略理解,每2位被开方数可得到1位结果,然后余数就扔给下一轮计算,跟除法一样。两位两位地排是因为平方关系,算立方根当然就是3位3位地排好咯。

十进制就是 b(20a%2Bb)

二进制就是b(4a%2Bb),而且b不是0就是1,不用像十进制那样要比较很多次,也不需要用到乘法。

        二进制计算中 4a 恰好是 a 左移2位,想到这就能理解代码了。下面就看别人代码是怎么通过 root 的移动实现 root 既作根也作 4a 的。

        可以看到,place的作用有:1、标记;2、在 b(4a%2Bb) 里面,参与比较;3、为 root 赋值。


整数开平方算法学习记录的评论 (共 条)

分享到微博请遵守国家法律