मान लीजिए कि हमारे पास अधिकतम और न्यूनतम दो लंबे पूर्णांक मान हैं। हमें एक उभयनिष्ठ भिन्न n/d इस प्रकार ज्ञात करना है कि min <=d <=max. और |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
- फेयरी के अंत में जोड़ी (e, f) डालें
- यदि P <(e/f) का मान है, तो
- c :=e और d :=f
- अन्यथा,
- a :=e और b :=f
- p_min :=तल (P * न्यूनतम)
- जबकि न्यूनतम <=अधिकतम, करें
- c :=0, d :=0
- फेयरी में प्रत्येक जोड़ी (ए, बी) के लिए, करते हैं
- यदि न्यूनतम + b> अधिकतम, तो
- लूप से बाहर आएं
- अगर |(p_min + a)/ (न्यूनतम + b) - P| <|p_min / न्यूनतम - पी|, फिर
- c :=a, d :=b
- लूप से बाहर आएं
- यदि न्यूनतम + b> अधिकतम, तो
- यदि d, 0 के समान है, तो
- लूप से बाहर आएं
- p_min :=p_min + c
- ओ न्यूनतम:=न्यूनतम + घ
- ओ रिटर्न अंश (p_min + 3 * न्यूनतम) / न्यूनतम
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
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