2008-10-09 129 views
18

मैंने आज एक दिलचस्प दैनिक डब्ल्यूटीएफ पोस्ट पढ़ा, "Out of All The Possible Answers..." और यह मुझे प्रस्तुत किया गया था जहां मूल forum post खोदने के लिए पर्याप्त दिलचस्पी है।संख्याओं की एक श्रृंखला के एलसीएम को ढूंढना

2520 सबसे छोटी संख्या है कि किसी भी शेष के बिना 1 से 10 तक संख्या से प्रत्येक के द्वारा विभाजित किया जा सकता है: मूल प्रश्न के रूप में Project Euler पर उत्पन्न कर रहा है - यह मैं सोच कैसे मैं इस दिलचस्प समस्या का समाधान होगा मिला है।

द्वारा 1 से 20 तक की संख्या के समान समान रूप से विभाजित करने वाला सबसे छोटा नंबर क्या है?

एक प्रोग्रामिंग सवाल के रूप में इस सुधार करने के लिए, कैसे आप एक समारोह है कि संख्या की एक मनमाना सूची के लिए सबसे छोटा आम गुणक पा सकते हैं बनाएंगे?

मैं प्रोग्रामिंग में रूचि के बावजूद शुद्ध गणित के साथ अविश्वसनीय रूप से खराब हूं, लेकिन मैं थोड़ा गुगलिंग और कुछ प्रयोग करने के बाद इसे हल करने में सक्षम था। मैं उत्सुक हूं कि एसओ उपयोगकर्ता क्या अन्य दृष्टिकोण ले सकते हैं। यदि आप इतने इच्छुक हैं, तो नीचे दिए गए कुछ कोड पोस्ट करें, आशा है कि एक स्पष्टीकरण के साथ। ध्यान दें कि जब मुझे यकीन है कि विभिन्न भाषाओं में जीसीडी और एलसीएम की गणना करने के लिए पुस्तकालय मौजूद हैं, तो मुझे लाइब्रेरी फ़ंक्शन को कॉल करने से अधिक तर्क सीधे प्रदर्शित होता है :-)

मैं सबसे परिचित हूं पायथन, सी, सी ++, और पर्ल, लेकिन आपकी पसंद की कोई भी भाषा आपका स्वागत है। मेरे जैसे अन्य गणितीय-चुनौतीपूर्ण लोगों के लिए तर्क की व्याख्या करने के लिए बोनस अंक।

संपादित: प्रस्तुत करने मैं इस समान प्रश्न Least common multiple for 3 or more numbers मिला लेकिन यह एक ही मूल कोड मैं पहले से ही पता लगा और वहाँ कोई वास्तविक व्याख्या दी गई है साथ जवाब के बाद, तो मुझे लगा कि यह काफी अलग खुला छोड़ने के लिए गया था।

+0

btw - जवाब 10,581,480 है? मेरा मानना ​​है कि यह विशेष समस्या का सही उत्तर है :) – warren

+1

@warren - मैं आपके उत्तर से बाहर निकल गया था, क्योंकि थोड़ी देर के लिए मैंने सोचा था कि आप सही थे (केवल इस सवाल को मिला), और एलसीएम कैलक्यूलेटर में मैंने लिखा था हास्केल एक जंगली अलग जवाब दे रहा था, और 10581480 [1..20] तक विभाजित होना प्रतीत होता था। मैंने कहीं गलती की होनी चाहिए क्योंकि आपका उत्तर 11 या 16 तक समान रूप से विभाजित नहीं है। सही उत्तर 232792560 है। –

+0

@ मैट एलन - अच्छी कॉल, सुनिश्चित नहीं है कि मैं अपने उत्तर में 11 कैसे चूक गया :) – warren

उत्तर

11

यह समस्या दिलचस्प है क्योंकि आपको संख्याओं के मनमानी सेट के एलसीएम को खोजने की आवश्यकता नहीं है, आपको लगातार सीमा दी जाती है। उत्तर खोजने के लिए आप Sieve of Eratosthenes की विविधता का उपयोग कर सकते हैं।

def RangeLCM(first, last): 
    factors = range(first, last+1) 
    for i in range(0, len(factors)): 
     if factors[i] != 1: 
      n = first + i 
      for j in range(2*n, last+1, n): 
       factors[j-first] = factors[j-first]/factors[i] 
    return reduce(lambda a,b: a*b, factors, 1) 


संपादित करें: हाल ही में एक वोट दें मुझे इस सवाल का जवाब है जो वर्ष 3 वर्ष से अधिक है फिर से जांच किए गए। मेरा पहला अवलोकन यह है कि उदाहरण के लिए enumerate का उपयोग करके मैंने इसे थोड़ा अलग लिखा होगा।

दूसरा अवलोकन यह है कि यह एल्गोरिदम केवल तभी काम करता है जब सीमा की शुरुआत 2 या उससे कम हो, क्योंकि यह सीमा की शुरुआत के नीचे सामान्य कारकों को छुटकारा पाने की कोशिश नहीं करती है। उदाहरण के लिए, रेंज एलसीएम (10, 12) सही 660 के बजाय 1320 लौटाता है।

तीसरा अवलोकन यह है कि किसी ने भी इस उत्तर को किसी अन्य उत्तर के खिलाफ समय देने का प्रयास नहीं किया। मेरे आंत ने कहा कि यह एक क्रूर बल एलसीएम समाधान में सुधार होगा क्योंकि सीमा बड़ी हो गई है। परीक्षण ने कम से कम एक बार, मेरे आंत को सही साबित कर दिया।

चूंकि एल्गोरिदम मनमाने ढंग से श्रेणियों के लिए काम नहीं करता है, इसलिए मैं यह मानने के लिए पुनः लिखता हूं कि सीमा 1 से शुरू होती है। मैंने अंत में कॉल को reduce पर हटा दिया, क्योंकि परिणामों को गणना करना आसान था क्योंकि कारक उत्पन्न हुए थे । मेरा मानना ​​है कि समारोह का नया संस्करण समझने के लिए और अधिक सही और आसान दोनों है।

def RangeLCM2(last): 
    factors = range(last+1) 
    result = 1 
    for n in range(last+1): 
     if factors[n] > 1: 
      result *= factors[n] 
      for j in range(2*n, last+1, n): 
       factors[j] /= factors[n] 
    return result 

यहाँ मूल और समाधान Joe Bebel द्वारा प्रस्तावित है जो मेरे परीक्षण में RangeEuclid कहा जाता है के खिलाफ कुछ समय की तुलना कर रहे हैं।

>>> t=timeit.timeit 
>>> t('RangeLCM.RangeLCM(1, 20)', 'import RangeLCM') 
17.999292996735676 
>>> t('RangeLCM.RangeEuclid(1, 20)', 'import RangeLCM') 
11.199833288867922 
>>> t('RangeLCM.RangeLCM2(20)', 'import RangeLCM') 
14.256165588084514 
>>> t('RangeLCM.RangeLCM(1, 100)', 'import RangeLCM') 
93.34979585394194 
>>> t('RangeLCM.RangeEuclid(1, 100)', 'import RangeLCM') 
109.25695507389901 
>>> t('RangeLCM.RangeLCM2(100)', 'import RangeLCM') 
66.09684505991709 

1 20 प्रश्न में दिए गए के सीमा के लिए, यूक्लिड के एल्गोरिथ्म दोनों मेरे पुराने और नए जवाब धड़कता है। 1 से 100 की सीमा के लिए आप चलनी-आधारित एल्गोरिदम आगे खींच सकते हैं, खासकर अनुकूलित संस्करण।

+0

धन्यवाद मार्क! यह वास्तव में एक तरह का दिलचस्प जवाब है जो मुझे दिमाग में था :-) – Jay

+0

जो काफी चालाक है - मैंने इस तरह से इस बारे में सोचा नहीं था :) – warren

-1

@ अलेक्जेंडर की टिप्पणी पर विस्तार करने में, मैं यह इंगित करता हूं कि यदि आप संख्याओं को उनके प्राइम पर कारक बना सकते हैं, तो डुप्लिकेट हटाएं, फिर गुणा करें, तो आपका जवाब होगा।

उदाहरण के लिए, 1-5 में 2,3,2,2,5 के प्रमुख कारक हैं। '4' की कारक सूची से डुप्लीकेट '2' निकालें, और आपके पास 2,2,3,5 है। उन लोगों को गुणा करने से 60 मिलते हैं, जो आपका जवाब है।

पिछली टिप्पणी में प्रदान किया गया वोल्फ्राम लिंक, http://mathworld.wolfram.com/LeastCommonMultiple.html अधिक औपचारिक दृष्टिकोण में जाता है, लेकिन लघु संस्करण ऊपर है।

चीयर्स।

+2

क्या नहीं है "डुप्लिकेट हटाएं "मतलब है। आप 2 से '2' को हटा रहे हैं क्योंकि यह 4 के कारक से कब्जा कर लिया गया है। यह केवल अर्थशास्त्र नहीं है। न्याय इसे थोड़ा बेहतर रखता है। । आप बस प्रत्येक प्रधान की अधिकतम शक्ति का मूल्य लेना चाहते हैं। फिर, आप जानते हैं कि कम शक्तियां कारक हैं। – Baltimark

+0

@ बाल्टिमर्क - उत्कृष्ट बिंदु – warren

2

एक या अधिक संख्याओं का एलसीएम सभी संख्याओं में सभी विशिष्ट प्रमुख कारकों का उत्पाद है, प्रत्येक प्राइम उन सभी शक्तियों के अधिकतम शक्ति की शक्ति के लिए है जो उस स्रोत में दिखाई देने वाले नंबरों में दिखाई देते हैं एलसीएम का।

कहें 900 = 2^3 * 3^2 * 5^2, 26460 = 2^2 * 3^3 * 5^1 * 7^2। 2 की अधिकतम शक्ति 3 है, 3 की अधिकतम शक्ति 3 है, अधिकतम शक्ति 5 है, अधिकतम शक्ति 7 है, और किसी भी उच्च प्रधान की अधिकतम शक्ति 0. है इसलिए एलसीएम है: 264600 = 2^3 * 3^3 * 5^2 * 7^2।

+0

प्रतिक्रिया के लिए धन्यवाद, यह आपके जैसा दिखता है और वॉरेन ने वही मूल उत्तर प्रदान किया। मैं आशा करता था कि कोड कोड में इसे हल करने के लिए लोग अलग-अलग दृष्टिकोण दिखाते हुए नमूनों को पोस्ट करेंगे, अगर आप इस तकनीक का उपयोग करके एल्गोरिदमिक दृष्टिकोण पोस्ट कर सकते हैं तो यह बहुत अच्छा होगा! – Jay

1

हास्केल में एक एल्गोरिदम। यह वह भाषा है जिसे मैं आजकल एल्गोरिदमिक सोच के लिए सोचता हूं। यह अजीब, जटिल, और uninviting लग सकता है - Haskell में आपका स्वागत है!

primes :: (Integral a) => [a] 
--implementation of primes is to be left for another day. 

primeFactors :: (Integral a) => a -> [a] 
primeFactors n = go n primes where 
    go n [email protected](p : pt) = 
     if q < 1 then [] else 
     if r == 0 then p : go q ps else 
     go n pt 
     where (q, r) = quotRem n p 

multiFactors :: (Integral a) => a -> [(a, Int)] 
multiFactors n = [ (head xs, length xs) | xs <- group $ primeFactors $ n ] 

multiProduct :: (Integral a) => [(a, Int)] -> a 
multiProduct xs = product $ map (uncurry (^)) $ xs 

mergeFactorsPairwise [] bs = bs 
mergeFactorsPairwise as [] = as 
mergeFactorsPairwise [email protected]((an, am) : _) [email protected]((bn, bm) : _) = 
    case compare an bn of 
     LT -> (head a) : mergeFactorsPairwise (tail a) b 
     GT -> (head b) : mergeFactorsPairwise a (tail b) 
     EQ -> (an, max am bm) : mergeFactorsPairwise (tail a) (tail b) 

wideLCM :: (Integral a) => [a] -> a 
wideLCM nums = multiProduct $ foldl mergeFactorsPairwise [] $ map multiFactors $ nums 
+2

मुझे लगता है कि आपने इसे इंजीनियर बनाया है – Dan

+0

मेरे पास पहले से ही प्राइम फैक्टर, मल्टीफैक्टर, और मल्टीप्रॉडक्ट कुछ अन्य उद्देश्यों के लिए लिखा गया है (गणितीय हित, ज्यादातर)। अन्य दो कार्य बहुत खराब नहीं थे। – yfeldblum

0

यहाँ यह पर मेरे अजगर वार है:

#!/usr/bin/env python 

from operator import mul 

def factor(n): 
    factors = {} 
    i = 2 
    while i <= n and n != 1: 
     while n % i == 0: 
      try: 
       factors[i] += 1 
      except KeyError: 
       factors[i] = 1 
      n = n/i 
     i += 1 
    return factors 

base = {} 
for i in range(2, 2000): 
    for f, n in factor(i).items(): 
     try: 
      base[f] = max(base[f], n) 
     except KeyError: 
      base[f] = n 

print reduce(mul, [f**n for f, n in base.items()], 1) 

चरण एक एक नंबर के प्रधानमंत्री कारकों हो जाता है। चरण दो प्रत्येक कारक को देखे जाने की अधिकतम संख्या की हैश तालिका बनाता है, फिर उन सभी को एक साथ बढ़ाता है।

5

हास्केल में एक-लाइनर।

wideLCM = foldl lcm 1 

यह है कि मैं क्या समस्या 5.

19

अपने ही परियोजना यूलर के लिए इस्तेमाल किया जवाब बिल्कुल फैक्टरिंग या प्रधानमंत्री शक्तियों के मामले में किसी भी फैंसी फुटवर्क की आवश्यकता नहीं है है, और सबसे निश्चित रूप से चलनी की आवश्यकता नहीं है Eratosthenes के।

इसके बजाय, आप GCD कंप्यूटिंग यूक्लिड के एल्गोरिदम के उपयोग द्वारा एक जोड़ी की एलसीएम की गणना करना चाहिए (जो गुणन आवश्यकता नहीं है, और वास्तव में काफी तेजी है):


def lcm(a,b): 
    gcd, tmp = a,b 
    while tmp != 0: 
     gcd,tmp = tmp, gcd % tmp 
    return a*b/gcd 

तो आप कुल पा सकते हैं एलसीएम मेरे ऊपर एलसीएम का उपयोग कर सरणी को कम करने() फ़ंक्शन:


reduce(lcm, range(1,21)) 
+0

दरअसल, यह वही एल्गोरिदम है जिसके साथ मैं समाप्त हुआ, और इसी तरह के प्रश्न के समाधान के रूप में भी प्रदान किया गया था। यह हल करने के तरीके पर आम सहमति है। – Jay

+2

रिटर्न का उपयोग करें * (बी/जीसीडी) या वापसी (ए/जीसीडी) * बी। क्योंकि ए * बी बड़ी संख्या में हो सकता है। –

2
print "LCM of 4 and 5 = ".LCM(4,5)."\n"; 

sub LCM { 
    my ($a,$b) = @_;  
    my ($af,$bf) = (1,1); # The factors to apply to a & b 

    # Loop and increase until A times its factor equals B times its factor 
    while ($a*$af != $b*$bf) { 
     if ($a*$af>$b*$bf) {$bf++} else {$af++}; 
    } 
    return $a*$af; 
} 
9

इस के लिए एक तेजी से समाधान है, जब तक कि सीमा एन

करने के लिए 1 है

कुंजी अवलोकन है कि अगर n (< एन) प्रधानमंत्री गुणन p_1^a_1 * p_2^a_2 * ... p_k * a_k, है तो यह बिल्कुल वैसा ही कारकों एलसीएम को p_1^a_1 और p_2^a_2 ... p_k^a_k के रूप में योगदान करेगा। और इनमें से प्रत्येक शक्ति 1 से एन सीमा में भी है। इस प्रकार हम केवल हम

2^4 = 16 < 20 
3^2 = 9 < 20 
5^1 = 5 < 20 
7 
11 
13 
17 
19 

इन सभी प्रमुख शक्तियों को एक साथ जोड़ हम के लिए आवश्यक परिणाम प्राप्त है 20 के लिए एन से उच्चतम शुद्ध प्रधानमंत्री शक्तियों पर विचार करने के कम

उदाहरण के लिए की जरूरत है

2*2*2*2*3*3*5*7*11*13*17*19 = 232792560 

तो छद्म कोड में:

def lcm_upto(N): 
    total = 1; 
    foreach p in primes_less_than(N): 
    x=1; 
    while x*p <= N: 
     x=x*p; 
    total = total * x 
    return total 

अब तुम wo के भीतरी पाश ठीक कर सकते हैं अधिक गति प्राप्त करने के लिए आरके थोड़ा अलग है, और आप primes_less_than(N) फ़ंक्शन को सटीक बना सकते हैं।

संपादित करें:

हाल ही में एक वोट दें के कारण मैं इस पर दोबारा जाने, देखने का तरीका अन्य सूचीबद्ध एल्गोरिदम के साथ गति तुलना चला गया decideded।

Joes: 1.85s अंक: 3.26s खान: 0.33s

यहाँ एक लॉग है

10k पुनरावृत्तियों, जो Beibers और मार्क फिरौती तरीकों के खिलाफ के साथ सीमा 1-160 के लिए समय इस प्रकार हैं

01: अप करने के लिए 300.

A log-log graph with the results

कोड अपने परीक्षण यहां पाया जा सकता के लिए परिणामों के साथ -log ग्राफ

import timeit 


def RangeLCM2(last): 
    factors = range(last+1) 
    result = 1 
    for n in range(last+1): 
     if factors[n] > 1: 
      result *= factors[n] 
      for j in range(2*n, last+1, n): 
       factors[j] /= factors[n] 
    return result 


def lcm(a,b): 
    gcd, tmp = a,b 
    while tmp != 0: 
     gcd,tmp = tmp, gcd % tmp 
    return a*b/gcd 

def EuclidLCM(last): 
    return reduce(lcm,range(1,last+1)) 

primes = [ 
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 
31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 
73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 
127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 
179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 
233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 
283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 
353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 
419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 
467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 
547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 
607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 
661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 
739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 
811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 
877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 
947, 953, 967, 971, 977, 983, 991, 997 ] 

def FastRangeLCM(last): 
    total = 1 
    for p in primes: 
     if p>last: 
      break 
     x = 1 
     while x*p <= last: 
      x = x * p 
     total = total * x 
    return total 


print RangeLCM2(20) 
print EculidLCM(20) 
print FastRangeLCM(20) 

print timeit.Timer('RangeLCM2(20)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(20)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(20)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(40)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(40)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(40)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(60)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(60)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(60)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(80)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(80)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(80)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(100)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(100)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(100)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(120)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(120)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(120)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(140)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(140)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(140)', "from __main__ import FastRangeLCM").timeit(number=10000) 

print timeit.Timer('RangeLCM2(160)', "from __main__ import RangeLCM2").timeit(number=10000) 
print timeit.Timer('EuclidLCM(160)', "from __main__ import EuclidLCM").timeit(number=10000) 
print timeit.Timer('FastRangeLCM(160)', "from __main__ import FastRangeLCM").timeit(number=10000) 
+2

प्राइम्स <1000 की उस लंबी सूची के बजाय, आप 'primes = [2,3] + [x x में श्रेणी के लिए x (5,1000,2) कह सकते हैं यदि पाउ (3, x-1, x) == 1 == पाउ (2, एक्स -1, एक्स)] 'जो मिलीसेकंड से कम में निष्पादित होता है। –

+0

@ माइकल प्राइम्स खोजने के लिए आपने किस एल्गोरिदम का उपयोग किया था? – tilaprimera

+1

@tilaprimera मुझे लगता है कि मैंने उन्हें सिर्फ प्राइम की सूची से कॉपी किया है। लेकिन इस साइट पर आप प्राइम की गणना करने के लिए कई त्वरित एल्गोरिदम हैं। –

3

हास्केल में:

listLCM xs = foldr (lcm) 1 xs 

कौन सा आप एक सूची जैसे पारित कर सकते हैं:

*Main> listLCM [1..10] 
2520 
*Main> listLCM [1..2518] 
266595767785593803705412270464676976610857635334657316692669925537787454299898002207461915073508683963382517039456477669596355816643394386272505301040799324518447104528530927421506143709593427822789725553843015805207718967822166927846212504932185912903133106741373264004097225277236671818323343067283663297403663465952182060840140577104161874701374415384744438137266768019899449317336711720217025025587401208623105738783129308128750455016347481252967252000274360749033444720740958140380022607152873903454009665680092965785710950056851148623283267844109400949097830399398928766093150813869944897207026562740359330773453263501671059198376156051049807365826551680239328345262351788257964260307551699951892369982392731547941790155541082267235224332660060039217194224518623199770191736740074323689475195782613618695976005218868557150389117325747888623795360149879033894667051583457539872594336939497053549704686823966843769912686273810907202177232140876251886218209049469761186661055766628477277347438364188994340512556761831159033404181677107900519850780882430019800537370374545134183233280000 
0

यह शायद सबसे स्वच्छ, कम से कम जवाब है (दोनों कोड की लाइनों के संदर्भ में) कि मैं अब तक देखा है।

def gcd(a,b): return b and gcd(b, a % b) or a 
def lcm(a,b): return a * b/gcd(a,b) 

n = 1 
for i in xrange(1, 21): 
    n = lcm(n, i) 

स्रोत: http://www.s-anand.net/euler.html

0

यहाँ जावास्क्रिप्ट में मेरा जवाब है। मैंने पहली बार प्राइम से इसका संपर्क किया, और प्राइम ढूंढने के लिए पुन: प्रयोज्य कोड का एक अच्छा काम विकसित किया और प्रमुख कारकों को भी ढूंढने के लिए, लेकिन अंत में फैसला किया कि यह दृष्टिकोण सरल था।

मेरे उत्तर में कुछ भी अद्वितीय नहीं है जो ऊपर पोस्ट नहीं किया गया है, यह सिर्फ जावास्क्रिप्ट में है जिसे मैंने विशेष रूप से नहीं देखा था।

//least common multipe of a range of numbers 
function smallestCommons(arr) { 
    arr = arr.sort(); 
    var scm = 1; 
    for (var i = arr[0]; i<=arr[1]; i+=1) { 
     scm = scd(scm, i); 
    } 
    return scm; 
} 


//smallest common denominator of two numbers (scd) 
function scd (a,b) { 
    return a*b/gcd(a,b); 
} 


//greatest common denominator of two numbers (gcd) 
function gcd(a, b) { 
    if (b === 0) { 
     return a; 
    } else { 
     return gcd(b, a%b); 
    } 
}  

smallestCommons([1,20]); 
0

यहाँ मेरी जावास्क्रिप्ट समाधान है, मैं आप इसे आसान का पालन करने के आशा:

function smallestCommons(arr) { 
    var min = Math.min(arr[0], arr[1]); 
    var max = Math.max(arr[0], arr[1]); 

    var smallestCommon = min * max; 

    var doneCalc = 0; 

    while (doneCalc === 0) { 
    for (var i = min; i <= max; i++) { 
     if (smallestCommon % i !== 0) { 
     smallestCommon += max; 
     doneCalc = 0; 
     break; 
     } 
     else { 
     doneCalc = 1; 
     } 
    } 
    } 

    return smallestCommon; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे