循环节

阅读(2318) 标签: 无限循环, 除数, 求余, pos, concat, for, break,

l  问题

循环节即为无限循环小数中循环的数字部分。无限循环小数都可以表示为一个分数,所以给定一个分数,就可以求出它的循环节。请编写程序实现这个算法。

l  思路

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

1.  将被除数除以除数求余

2.  循环体中先判断余数在前面的计算中是否出现过,如果出现过,则中止循环

3.  如果没有出现过,则把当前余数加入历史余数序列中,然后把当前余数乘以10作为被除数再除以除数,所得商加入历史商序列中,所得余数替换当前余数,进入下一轮循环

4.  根据当前余数在历史余数中找到的位置开始到最后一位的位置,从历史商序列里找到对应位置的商,则为循环节

l  代码

 

A

B

C

 

1

99

 

 

被除数

2

140

 

 

除数

3

=A1%A2

 

 

取余

4

for

=B6.pos(A3)

 

定义无限循环,如果本次循环得到的余数在之前循环余数中出现过则结束循环,B4存余数出现的位置

5

 

if B4>0

break

 

6

 

=B6|A3

 

保存每次计算的余数

7

 

=B7|int(A3*10/A2)

 

保存每次计算的商

8

 

>A3=A3*10%A2

 

刷新A3为当前余数

9

=B7.to(B4,).concat()

 

 

B7中从位置B4开始到最后的数字为循环节,将循环节取出拼成字符串

 

l  结果