📅  最后修改于: 2023-12-03 15:07:58.097000             🧑  作者: Mango
在数学中,经过有理数运算的数字可能会产生无限循环的序列。比如,1/3 = 0.33333…,其中 3 持续出现,构成了循环序列。对于一个分数,如果它的小数表示有循环序列,那么我们称它是一个循环小数。
在数学中,我们已经知道如何将一个分数转化成循环小数。而对于程序员来说,如何快速地找出循环序列成为了一个常见的问题。本篇文档将会介绍两种常见的解决方法。
第一种方法是通过 long division 转化法来找到循环序列。具体实现如下:
代码示例(python):
def find_recurring_cycle(p, q):
remainder_dict = {}
remainder = p % q
recurring_cycle = []
while remainder != 0 and remainder not in remainder_dict:
remainder_dict[remainder] = len(recurring_cycle)
quotient, remainder = divmod(10 * remainder, q)
recurring_cycle.append(str(quotient))
if remainder == 0:
return None
else:
return recurring_cycle[remainder_dict[remainder]:]
第二个解决方法需要用到 Floyd Cycle Detection Algorithm。具体来说,我们可以使用快慢指针找到循环的起点。
代码示例(python):
def find_recurring_cycle(p, q):
fast_pointer = p % q
slow_pointer = p % q
length = 0
while True:
length += 1
fast_pointer = (fast_pointer * 10) % q
slow_pointer = (slow_pointer * 10) % q
fast_pointer = (fast_pointer * 10) % q
if fast_pointer == slow_pointer:
break
slow_pointer = p % q
for i in range(length):
fast_pointer = (fast_pointer * 10) % q
while fast_pointer != slow_pointer:
fast_pointer = (fast_pointer * 10) % q
slow_pointer = (slow_pointer * 10) % q
if slow_pointer == 0:
return None
else:
return str(slow_pointer)
在本篇文章中,我们介绍了两种常见的方法来找到循环小数中的重复序列。第一种方法是通过 long division 转化法来找到重复序列,第二种方法是使用 Floyd Cycle Detection Algorithm 通过快慢指针找到循环的起点。在实际中,我们可以根据具体情况选择适合自己的解决方法。