题目描述
给定正整数a, b,如果a 除以 b 结果为无限循环小数,求解该无限循环小数的循环节及其长度。
题解思路
模拟长除法的计算过程。
利用长除法求解 3/7,具体如下图:
求解算法描述
- 被除数除以除数的余数,记录余数。(如果余数为0,说明数可以被除尽,即没有循环节)
- 在余数后面加个0(即余数乘以十),把乘以10 的余数当作新的被除数,除数不变,记录余数并判断余数是否出现过(出现即可停止,说明找到循环节);
- 不断的循环1、2这个过程,直到余数重复出现;
Python代码实现
def solve(a, b):
index = 0
t = a % b
if t == 0:
return index, ""
# 存放循环小数的索引
flag = [-1 for _ in range(10000)]
k = 0
length = 0
res = []
stack = []
while True:
v = (t * 10) // b
t = (t * 10) % b
if t == 0:
index = k + 1
length = 0
break
if flag[t] >= 0:
index = flag[t]
length = k - index
break
stack.append(str(v))
flag[t] = k
k = k + 1
if length == 0:
return 0, ""
else:
return length, "".join(stack[index:k])
案例测试: