📅  最后修改于: 2023-12-03 15:41:45.574000             🧑  作者: Mango
无限循环小数是指有限的数字重复无限次构成的小数。例如:
$$ \frac{1}{3} = 0.3333... \ \frac{1}{6} = 0.1666... \ \frac{5}{9} = 0.5555... $$
有一个简单的方法可以将无限循环小数表示为分数,即将小数的循环部分视为一个变量,通过代数运算求解。例如:
$$ \begin{aligned} 0.3333... &= 0.\overline{3} \ &= \frac{3}{10} + \frac{3}{100} + \frac{3}{1000} + ... \ &= \frac{3}{10} \cdot \left(1 + \frac{1}{10} + \frac{1}{100} + ...\right) \ &= \frac{3}{10} \cdot \frac{1}{1-\frac{1}{10}} \ &= \frac{3}{10} \cdot \frac{10}{9} \ &= \frac{1}{3} \end{aligned} $$
因此,$0.3333...$ 可以表示为 $\frac{1}{3}$。
假设分数 $x$ 可表示为 $\frac{p}{q}$,其中 $p$ 和 $q$ 为正整数且互质,则 $x$ 的循环节长度为 $l$ 当且仅当 $10^l \equiv 1 \pmod q$,且 $x$ 可表示为 $\frac{a}{q} + \frac{b}{q(10^l - 1)}$,其中 $a = \lfloor x \rfloor$,$b$ 为 $x$ 的小数部分乘以 $10^l - 1$ 后取整数部分。
例如,$\frac{1}{3} = 0.\overline{3}$,因为 $10^1 \equiv 1 \pmod 3$,所以 $0.\overline{3} = \frac{3}{10-1} \cdot \left(\frac{1}{3} - 0\right) = \frac{1}{3}$。
因此,$0.3333...$ 可以表示为 $\frac{3}{9}$,即 $\frac{1}{3}$ 的约分形式。
def convert_recurring_decimal_to_fraction(num_str: str) -> str:
"""
将无限循环小数转换为分数
:param num_str: 无限循环小数字符串,格式为 "0.abc...xyz(a,b,c...z 为循环部分)"
:return: 分数字符串,格式为 "p/q"
"""
# 将小数部分和循环节部分分离
integer_part, decimal_part = num_str.split(".")
recurring_part_start = decimal_part.index("(")
recurring_part_end = decimal_part.index(")")
recurring_part = decimal_part[recurring_part_start + 1: recurring_part_end]
non_recurring_part = decimal_part[:recurring_part_start]
# 计算分数
denominator = int("9" * len(recurring_part) + "0" * len(non_recurring_part))
numerator = int(non_recurring_part + recurring_part) - int(non_recurring_part)
gcd_num = math.gcd(numerator, denominator)
numerator //= gcd_num
denominator //= gcd_num
return f"{numerator}/{denominator}"
以上是用 Python 编写的将无限循环小数转换为分数的函数。函数接收一个无限循环小数字符串,返回一个分数字符串。该函数将小数部分和循环节部分分离,根据上文提到的算法计算分数。对于 $0.3333...$,函数返回的结果为 $\frac{3}{9}$,即 $\frac{1}{3}$ 的分数形式。