使用给定的约束在 Python 中查找最小值和最大值之间的共同分数的程序
pythonserver side programmingprogramming更新于 2026/2/1 23:40:17
假设我们有两个长整数值,最大值和最小值。我们必须找到一个共同分数 n/d,使得最小值 <= d <= 最大值。并且 |n/d - pi| 最小。这里 pi = 3.14159265... 如果有多个分数满足此条件,则返回分母最小的分数。
因此,如果输入为最小值 = 1 最大值 = 10,则输出为 22/7。
为了解决这个问题,我们将遵循以下步骤 −
- P := 分数 (5706674932067741 / 1816491048114374) - 3
- a := 0, b := 1, c := 1, d := 1
- farey := 一对数组,它最初有两对 (a, b) 和 (c, d)
- 无条件循环以下内容 -
- f := b + d
- 如果 f > 最大值 - 最小值,则
- 退出循环
- e := a + c
- 在farey的末尾插入对(e,f)
- 如果P< (e / f)的值,则
- c := e 和 d := f
- 否则,
- a := e 和 b := f
- p_min := (P * 最小值) 的下限
- 当最小值<= 最大值时,执行
- c := 0,d := 0
- 对于farey中的每一对(a,b),执行
- 如果最小值 + b >最大值,则
- 退出循环
- 如果 |(p_min + a)/ (minimum + b) - P| <|p_min / minimal - P|,则
- c := a, d := b
- 退出循环
- 如果最小值 + b >最大值,则
- 如果 d 与 0 相同,则
- 退出循环
- p_min := p_min + c
- o minimum := minimum + d
- o return fraction (p_min + 3 * minimum) / minimum
示例
让我们看看下面的实现以便更好地理解 −
from fractions import Fraction
def solve(minimum, maximum):
P = Fraction(5706674932067741, 1816491048114374) - 3
a, b, c, d = 0, 1, 1, 1
farey = [(a,b),(c,d)]
while True:
f = b + d
if f > maximum - minimum:
break
e = a + c
farey.append((e, f))
if P < Fraction(e, f):
c, d = e, f
else:
a, b = e, f
p_min = int(P * minimum)
while minimum <= maximum:
c, d = 0, 0
for a, b in farey:
if minimum + b > maximum:
break
if abs(Fraction(p_min + a, minimum + b).real - P) < abs(Fraction(p_min, minimum).real - P):
c, d = a, b
break
if d == 0:
break
p_min += c
minimum += d
return ("{}/{}".format(p_min + 3 * minimum, minimum))
minimum = 1
maximum = 10
print(solve(minimum, maximum))
输入
4, 27
输出
22/7
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

