给定正整数a, b,如果a 除以 b 结果为无限循环小数,求解该无限循环小数的循环节及其长度。
模拟长除法的计算过程。
利用长除法求解 3/7,具体如下图:

求解算法描述
- 被除数除以除数的余数,记录余数。(如果余数为0,说明数可以被除尽,即没有循环节)
- 在余数后面加个0(即余数乘以十),把乘以10 的余数当作新的被除数,除数不变,记录余数并判断余数是否出现过(出现即可停止,说明找到循环节);
- 不断的循环1、2这个过程,直到余数重复出现;
- 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])
案例测试:
