笔算开平方

一、算法流程

(1)设要开方的数为 AA,将 AA 的数字两两分组,从左到右记为 A1,A2,A_{1},A_{2},\ldots,例如

7586937586937896578965\begin{aligned}758693 &\Rightarrow 75'86'93 \\ 78965 &\Rightarrow 7'89'65\end{aligned}

在第一个例子中,

A1=75,A2=86,A3=93A_{1}=75,A_{2}=86,A_{3}=93

在第二个例子中,

A1=7,A2=89,A3=65A_{1}=7,A_{2}=89,A_{3}=65

为了计算方便,接下来的过程中以 A=7586A=75'86 为例

(2)将第一位开方:即计算满足 x12A1x_{1}^2\leq A_1 的最大的 x1x_{1}

x1275max{x1}=8x_{1}^2\leq 75\Rightarrow \max\{x_{1}\}=8

然后将 x12x_{1}^2,也就是 6464 写下来,相减抄下去

(3)我们知道,对于普通的除法,接下来的操作是下移一位,但在开平方中,我们需要下移两位,然后将当前商乘以 2020,计算满足 (20x1+x2)x2A2(20x_1+x_2)x_2\leq A_2 的最大的 x2x_{2},显然 x2<10x_{2}<10

(160+x2)x21168max{x2}=6(160+x_{2})x_{2}\leq 1168\Rightarrow \max\{x_{2}\}=6

(20x1+x2)x2(20x_{1}+x_{2})x_{2} 的结果写下来相减,如图所示:

(4)重复(3)过程即可,只要你想,你可以不断开下去,当然你可能发现了,越往后计算越复杂


二、算法原理

我们假设开方的结果是

P=i=0n10ixiP=\sum_{i=0}^{n}10^i x_{i}

那么我们尝试把 PP 平方,即

P2=i=0n(102ixi2+2×10ixij=i+1n10jxj)P^2=\sum_{i=0}^{n} (10^{2i} x_{i}^{2}+ 2\times 10^{i} x_{i} \sum_{j=i+1}^{n}10^{j} x_{j} )

P2=i=0n10ixi(10ixi+2j=i+1n10jxj)P^2=\sum_{i=0}^{n} 10^i x_{i}(10^i x_{i} + 2 \sum_{j=i+1}^{n}10^{j} x_{j} )

接下来我们考虑各项的意义:

(1)10ixi10^i x_{i} 项就是商中当前正在计算的位置的数

(2)2j=i+1n10jxj2 \sum_{j=i+1}^{n}10^j x_{j} 就是当前位前面的位的累加和乘以 22 的结果

我们的思想是逐位确定

首先确定第一位,方法是显然的

然后假设后面的位都是 00,然后按照上面的式子求解最小的符合条件的当前位的值

这样不断地逐位进行确定就可以实现笔算开平方