编程题:寻找无限循环小数的循环节及长度

题目描述

给定正整数a, b,如果a 除以 b 结果为无限循环小数,求解该无限循环小数的循环节及其长度。

题解思路

模拟长除法的计算过程。

利用长除法求解 3/7,具体如下图:

求解算法描述

  1. 被除数除以除数的余数,记录余数。(如果余数为0,说明数可以被除尽,即没有循环节)
  2. 在余数后面加个0(即余数乘以十),把乘以10 的余数当作新的被除数,除数不变,记录余数并判断余数是否出现过(出现即可停止,说明找到循环节);
  3. 不断的循环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])

案例测试:

猜你喜欢

转载自blog.csdn.net/weixin_44402973/article/details/126347213