आसान।
स्यूडोकोड
a = b = floor(sqrt(N))
if (a * b >= N) return (a, b)
a += 1
if (a * b >= N) return (a, b)
return (a, b+1)
में और यह हमेशा समाप्त हो जाएगी, a
और b
के बीच की दूरी पर सबसे केवल 1.
यदि आप दूसरी बाधा आराम बहुत कठिन होगा, लेकिन है कि एक और सवाल है।
संपादित करें: जैसा कि ऐसा लगता है कि पहली स्थिति अधिक महत्वपूर्ण है, आपको समस्या को थोड़ा अलग तरीके से हमला करना है। आपको खराबता मापने के लिए कुछ विधि निर्दिष्ट करने की आवश्यकता है, जो कि चौकोर पर्याप्त = दूसरी स्थिति नहीं है, क्योंकि यहां तक कि प्राइम संख्याओं को 1*number
के रूप में कारक बनाया जा सकता है, और हम पहली शर्त को पूरा करते हैं। मान लें कि हमारे पास एक बुरी तरह का कार्य है (a >= b && a <= 2 * b
कहें), फिर N
को कारगर बनाएं और सर्वोत्तम संयोजन खोजने के लिए विभिन्न संयोजनों को आजमाएं। यदि कोई अच्छा पर्याप्त नहीं है, तो N+1
और इसी तरह से प्रयास करें।
EDIT2: थोड़ा सोच के बाद और अधिक मैं इस समाधान के साथ आते हैं, पायथन में:
from math import sqrt
def isok(a, b):
"""accept difference of five - 2nd rule"""
return a <= b + 5
def improve(a, b, N):
"""improve result:
if a == b:
(a+1)*(b-1) = a^2 - 1 < a*a
otherwise (a - 1 >= b as a is always larger)
(a+1)*(b-1) = a*b - a + b - 1 =< a*b
On each iteration new a*b will be less,
continue until we can, or 2nd condition is still met
"""
while (a+1) * (b-1) >= N and isok(a+1, b-1):
a, b = a + 1, b - 1
return (a, b)
def decomposite(N):
a = int(sqrt(N))
b = a
# N is square, result is ok
if a * b >= N:
return (a, b)
a += 1
if a * b >= N:
return improve(a, b, N)
return improve(a, b+1, N)
def test(N):
(a, b) = decomposite(N)
print "%d decomposed as %d * %d = %d" % (N, a, b, a*b)
[test(x) for x in [99, 100, 101, 20, 21, 22, 23]]
जो आउटपुट
99 decomposed as 11 * 9 = 99
100 decomposed as 10 * 10 = 100
101 decomposed as 13 * 8 = 104
20 decomposed as 5 * 4 = 20
21 decomposed as 7 * 3 = 21
22 decomposed as 6 * 4 = 24
23 decomposed as 6 * 4 = 24
के बीच स्थिति 1 शर्त 2 से अधिक महत्वपूर्ण है? – palswim
मुझे ऐसा लगता है। शायद प्रत्येक शर्त के लिए एक उपयोगकर्ता चयन योग्य कारक। उदाहरण के लिए, Fac1 * Func (AXB - N) + Fac2 * Func (A - B) –
21 के लिए आप समाधान के रूप में 4 x 5 देते हैं लेकिन 4 x 5 <21 तो यह एक लागत फ़ंक्शन को कम करने का प्रयास करें एक संभावित समाधान नहीं है। – Amos