أصغر عدد يقبل القسمة على أول رقم n

أصغر عدد يقبل القسمة على أول رقم n
جربه على ممارسة GfG

نظرا لعدد ن ابحث عن أصغر عدد قابل للقسمة بالتساوي على كل رقم من 1 إلى n.
أمثلة:  
 

 Input : n = 4 Output : 12 Explanation : 12 is the smallest numbers divisible by all numbers from 1 to 4 Input : n = 10 Output : 2520 Input : n = 20 Output : 232792560  


إذا لاحظت بعناية سنين يجب أن يكون LCM للأرقام من 1 إلى n
للعثور على LCM للأعداد من 1 إلى n - 
 

  1. تهيئة الجواب = 1. 
     
  2. كرر على جميع الأرقام من i = 1 إلى i = n. 
    في التكرار الأول الإجابة = LCM(1 2 ……..i) . يمكن القيام بذلك بسهولة كما المضاعف المشترك الأصغر(1 2 ….i) = المضاعف المشترك الأصغر(الإجابة i)
    وبالتالي في التكرار، علينا فقط أن نفعل - 
     
 ans = LCM(ans i) = ans * i / gcd(ans i) [Using the below property a*b = gcd(ab) * lcm(ab)]  


ملحوظة : في كود C++، تتجاوز الإجابة بسرعة الحد الصحيح حتى الحد الطويل.
أدناه هو تنفيذ المنطق. 
 

C++
   // C++ program to find smallest number evenly divisible by    // all numbers 1 to n   #include       using     namespace     std  ;   // Function returns the lcm of first n numbers   long     long     lcm  (  long     long     n  )   {      long     long     ans     =     1  ;         for     (  long     long     i     =     1  ;     i      <=     n  ;     i  ++  )      ans     =     (  ans     *     i  )  /  (  __gcd  (  ans       i  ));      return     ans  ;   }   // Driver program to test the above function   int     main  ()      {      long     long     n     =     20  ;      cout      < <     lcm  (  n  );      return     0  ;   }   
Java
   // Java program to find the smallest number evenly divisible by    // all numbers 1 to n      class   GFG  {   static     long     gcd  (  long     a       long     b  )   {      if  (  a  %  b     !=     0  )         return     gcd  (  b    a  %  b  );      else         return     b  ;   }   // Function returns the lcm of first n numbers   static     long     lcm  (  long     n  )   {      long     ans     =     1  ;         for     (  long     i     =     1  ;     i      <=     n  ;     i  ++  )      ans     =     (  ans     *     i  )  /  (  gcd  (  ans       i  ));      return     ans  ;   }       // Driver program to test the above function   public     static     void     main  (  String     []  args  )      {      long     n     =     20  ;      System  .  out  .  println  (  lcm  (  n  ));   }   }   
Python
   # Python program to find the smallest number evenly    # divisible by all number 1 to n    import   math   # Returns the lcm of first n numbers    def   lcm  (  n  ):   ans   =   1   for   i   in   range  (  1     n   +   1  ):   ans   =   int  ((  ans   *   i  )  /  math  .  gcd  (  ans     i  ))   return   ans   # main    n   =   20   print   (  lcm  (  n  ))   
C#
   // C# program to find smallest number   // evenly divisible by    // all numbers 1 to n    using     System  ;   public     class     GFG  {      static     long     gcd  (  long     a       long     b  )      {      if  (  a  %  b     !=     0  )         return     gcd  (  b    a  %  b  );      else      return     b  ;      }      // Function returns the lcm of first n numbers    static     long     lcm  (  long     n  )      {         long     ans     =     1  ;         for     (  long     i     =     1  ;     i      <=     n  ;     i  ++  )         ans     =     (  ans     *     i  )  /  (  gcd  (  ans       i  ));         return     ans  ;      }      // Driver program to test the above function       static     public     void     Main     (){      long     n     =     20  ;         Console  .  WriteLine  (  lcm  (  n  ));         }   //This code is contributed by akt_mit    }   
Javascript
   // Javascript program to find the smallest number evenly divisible by    // all numbers 1 to n   function     gcd  (  a       b  )   {      if  (  a  %  b     !=     0  )         return     gcd  (  b    a  %  b  );      else         return     b  ;   }       // Function returns the lcm of first n numbers   function     lcm  (  n  )   {      let     ans     =     1  ;         for     (  let     i     =     1  ;     i      <=     n  ;     i  ++  )      ans     =     (  ans     *     i  )  /  (  gcd  (  ans       i  ));      return     ans  ;   }       // function call          let     n     =     20  ;      console  .  log  (  lcm  (  n  ));       
PHP
      // Note: This code is not working on GFG-IDE    // because gmp libraries are not supported   // PHP program to find smallest number    // evenly divisible by all numbers 1 to n   // Function returns the lcm    // of first n numbers   function   lcm  (  $n  )   {   $ans   =   1  ;   for   (  $i   =   1  ;   $i    <=   $n  ;   $i  ++  )   $ans   =   (  $ans   *   $i  )   /   (  gmp_gcd  (  strval  (  ans  )   strval  (  i  )));   return   $ans  ;   }   // Driver Code   $n   =   20  ;   echo   lcm  (  $n  );   // This code is contributed by mits   ?>   

الإخراج
232792560 

تعقيد الوقت: O(n log2n) نظرًا لأن تعقيد _gcd(ab) في لغة c++ هو log2n ويتم تشغيله n مرات في الحلقة.
المساحة المساعدة: O(1)
الحل أعلاه يعمل بشكل جيد لإدخال واحد. ولكن إذا كان لدينا مدخلات متعددة فمن الجيد استخدام منخل إراتوستينس لتخزين جميع العوامل الأولية. يرجى الرجوع إلى المقالة أدناه للتعرف على النهج القائم على الغربال. 

النهج: [استخدام غربال إراتوستينس ]

لحل مشكلة العثور على أصغر عدد قابل للقسمة على أرقام 'n' الأولى بطريقة أكثر كفاءة، يمكننا استخدام منخل إراتوستينس لحساب الأعداد الأولية مسبقًا حتى 'n'. ثم يمكننا استخدام هذه الأعداد الأولية لحساب المضاعف المشترك الأصغر (LCM) بشكل أكثر كفاءة من خلال النظر في أعلى قوى لكل عدد أولي أقل من أو تساوي 'n'.

نهج خطوة بخطوة:

  • إنشاء أرقام أولية تصل إلى n: استخدم منخل إراتوستينس للعثور على جميع الأعداد الأولية حتى 'n'.
  • حساب LCM باستخدام هذه الأعداد الأولية: لكل عدد أولي حدد أعلى قوة لذلك الأولي والتي تكون أقل من أو تساوي 'n'. اضرب هذه القوى العليا معًا لتحصل على LCM

فيما يلي تنفيذ النهج أعلاه:

C++
   #include         #include          #include         using     namespace     std  ;   // Function to generate all prime numbers up to n using the   // Sieve of Eratosthenes   vector   <  int  >     sieve_of_eratosthenes  (  int     n  )   {      vector   <  bool  >     is_prime  (  n     +     1       true  );      int     p     =     2  ;      while     (  p     *     p      <=     n  )     {      if     (  is_prime  [  p  ])     {      for     (  int     i     =     p     *     p  ;     i      <=     n  ;     i     +=     p  )     {      is_prime  [  i  ]     =     false  ;      }      }      ++  p  ;      }      vector   <  int  >     prime_numbers  ;      for     (  int     p     =     2  ;     p      <=     n  ;     ++  p  )     {      if     (  is_prime  [  p  ])     {      prime_numbers  .  push_back  (  p  );      }      }      return     prime_numbers  ;   }   // Function to find the smallest number divisible by all   // numbers from 1 to n   long     long     smallest_multiple  (  int     n  )   {      vector   <  int  >     primes     =     sieve_of_eratosthenes  (  n  );      long     long     lcm     =     1  ;      for     (  int     prime     :     primes  )     {      // Calculate the highest power of the prime that is      //  <= n      int     power     =     1  ;      while     (  pow  (  prime       power     +     1  )      <=     n  )     {      ++  power  ;      }      lcm     *=     pow  (  prime       power  );      }      return     lcm  ;   }   int     main  ()   {      int     n     =     20  ;      cout      < <     smallest_multiple  (  n  )      < <  endl  ;      return     0  ;   }   
Java
   import     java.util.ArrayList  ;   import     java.util.List  ;   public     class   SmallestMultiple     {      // Function to generate all prime numbers up to n using      // the Sieve of Eratosthenes      public     static     List   <  Integer  >     sieveOfEratosthenes  (  int     n  )      {      boolean  []     isPrime     =     new     boolean  [  n     +     1  ]  ;      for     (  int     i     =     0  ;     i      <=     n  ;     i  ++  )     {      isPrime  [  i  ]     =     true  ;      }      int     p     =     2  ;      while     (  p     *     p      <=     n  )     {      if     (  isPrime  [  p  ]  )     {      for     (  int     i     =     p     *     p  ;     i      <=     n  ;     i     +=     p  )     {      isPrime  [  i  ]     =     false  ;      }      }      p  ++  ;      }      List   <  Integer  >     primeNumbers     =     new     ArrayList   <>  ();      for     (  int     i     =     2  ;     i      <=     n  ;     i  ++  )     {      if     (  isPrime  [  i  ]  )     {      primeNumbers  .  add  (  i  );      }      }      return     primeNumbers  ;      }      // Function to find the smallest number divisible by all      // numbers from 1 to n      public     static     long     smallestMultiple  (  int     n  )      {      List   <  Integer  >     primes     =     sieveOfEratosthenes  (  n  );      long     lcm     =     1  ;      for     (  int     prime     :     primes  )     {      // Calculate the highest power of the prime that      // is  <= n      int     power     =     1  ;      while     (  Math  .  pow  (  prime       power     +     1  )      <=     n  )     {      power  ++  ;      }      lcm     *=     Math  .  pow  (  prime       power  );      }      return     lcm  ;      }      public     static     void     main  (  String  []     args  )      {      int     n     =     20  ;      System  .  out  .  println  (  smallestMultiple  (  n  ));      }   }   
Python
   import   math   def   sieve_of_eratosthenes  (  n  ):      '''Generate all prime numbers up to n.'''   is_prime   =   [  True  ]   *   (  n   +   1  )   p   =   2   while   (  p   *   p    <=   n  ):   if   (  is_prime  [  p  ]   ==   True  ):   for   i   in   range  (  p   *   p     n   +   1     p  ):   is_prime  [  i  ]   =   False   p   +=   1   prime_numbers   =   [  p   for   p   in   range  (  2     n   +   1  )   if   is_prime  [  p  ]]   return   prime_numbers   def   smallest_multiple  (  n  ):      '''Find the smallest number divisible by all numbers from 1 to n.'''   primes   =   sieve_of_eratosthenes  (  n  )   lcm   =   1   for   prime   in   primes  :   # Calculate the highest power of the prime that is  <= n   power   =   1   while   prime   **   (  power   +   1  )    <=   n  :   power   +=   1   lcm   *=   prime   **   power   return   lcm   # Example usage:   n   =   20   print  (  smallest_multiple  (  n  ))   
JavaScript
   // Function to generate all prime numbers up to n using the   // Sieve of Eratosthenes   function     sieveOfEratosthenes  (  n  )   {      let     isPrime     =     new     Array  (  n     +     1  ).  fill  (  true  );      let     p     =     2  ;      while     (  p     *     p      <=     n  )     {      if     (  isPrime  [  p  ])     {      for     (  let     i     =     p     *     p  ;     i      <=     n  ;     i     +=     p  )     {      isPrime  [  i  ]     =     false  ;      }      }      p  ++  ;      }      let     primeNumbers     =     [];      for     (  let     p     =     2  ;     p      <=     n  ;     p  ++  )     {      if     (  isPrime  [  p  ])     {      primeNumbers  .  push  (  p  );      }      }      return     primeNumbers  ;   }   // Function to find the smallest number divisible by all   // numbers from 1 to n   function     smallestMultiple  (  n  )   {      let     primes     =     sieveOfEratosthenes  (  n  );      let     lcm     =     1  ;      for     (  let     prime     of     primes  )     {      // Calculate the highest power of the prime that is      //  <= n      let     power     =     1  ;      while     (  Math  .  pow  (  prime       power     +     1  )      <=     n  )     {      power  ++  ;      }      lcm     *=     Math  .  pow  (  prime       power  );      }      return     lcm  ;   }   // Example usage:   let     n     =     20  ;   console  .  log  (  smallestMultiple  (  n  ));   

الإخراج
The smallest number divisible by all numbers from 1 to 20 is 232792560  

تعقيد الوقت: يا (تسجيل الدخول)
المساحة المساعدة: على)


إنشاء اختبار