Giả sử chúng ta có hai giá trị nguyên dài lớn nhất và nhỏ nhất. Chúng ta phải tìm một phân số chung n / d sao cho min <=d <=max. Và | n / d - pi | là nhỏ nhất. Ở đây pi =3,14159265 ... và nếu có nhiều hơn một phân số giữ điều kiện này, thì trả về phân số có mẫu số nhỏ nhất.
Vì vậy, nếu đầu vào giống như tối thiểu =1 tối đa =10, thì đầu ra sẽ là 22/7.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- P:=a fraction (5706674932067741/1816491048114374) - 3
- a:=0, b:=1, c:=1, d:=1
- ethery:=một mảng các cặp, ban đầu nó có hai cặp (a, b) và (c, d)
- Lặp lại những điều sau đây một cách vô điều kiện -
- f:=b + d
- nếu f> tối đa - tối thiểu, thì
- ra khỏi vòng lặp
- e:=a + c
- chèn cặp (e, f) vào cuối dấu ngoặc kép
- nếu P
- c:=e và d:=f
- theo chiều dọc,
- a:=e và b:=f
- c:=0, d:=0
- đối với mỗi cặp (a, b) trong khoảng thời gian ngắn, hãy thực hiện
- nếu tối thiểu + b> tối đa, thì
- ra khỏi vòng lặp
- nếu | (p_min + a) / (tối thiểu + b) - P | <| p_min / Minimum - P |, then
- c:=a, d:=b
- ra khỏi vòng lặp
- nếu tối thiểu + b> tối đa, thì
- nếu d giống 0, thì
- ra khỏi vòng lặp
- p_min:=p_min + c
- o tối thiểu:=tối thiểu + d
- o trả về phân số (p_min + 3 * tối thiểu) / tối thiểu
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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))
Đầu vào
4, 27
Đầu ra
22/7