求出无限循环小数的循环节

循环节即为无限循环小数中循环的数字部分。无限循环小数都可以表示为一个分数,所以给定一个分数的分子和分母,就可以求出它的循环节。

用分子和分母求余,判断余数在前面的计算中是否出现过,如果余数没有出现过,说明循环节未出现,则把余数乘以 10 作为被除数,继续循环计算求余。如果余数出现过则结束循环,从上次出现相同余数的位置到这次出现相同余数的位置之间的商即为无限循环小数中的循环节。


A B C
1 99 140 =A1%B1
2 for !(p=B2.pos(C1)) =@|C1 =C1*10
3
=@|(C2\B1) >C1= C2%B1
4 =B3.to(p,).concat()

https://try.esproc.com/splx?3gR

A1B1设置分数的分子和分母。C1用同余计算初始余数。

A2执行循环,直到C1中得到的余数出现了重复。B2中存储循环过程中出现过的余数,这也是A2循环执行时的判断依据。C2计算下一个被除数,B3存储循环过程中出现过的商,并计算下一位的商存入。C3更新C1中的余数为新的,继续下一轮循环。

SPL中可以直接用单元格名称作为参数名,单元格值作为参数值,这种类似Excel的模式,在代码中存储数据及分析数据非常方便。在SPL中可以用for x执行条件循环,在循环体中,用@表示当前格值,如B2相当于=B2|C1

本题中,循环结束时,B2记录的历史余数和B3记录的历史商如下:

.. ..

A7将历史商中对应的部分取出,用concat连接,记得到循环节。结果如下:

..