logo

Najmniejsza liczba podzielna przez n pierwszych liczb

Wypróbuj w praktyce GfG ' title=

Podany numer N znajdź najmniejszą liczbę podzielną równomiernie przez każdą liczbę od 1 do n.
Przykłady:  
 

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


Jeśli uważnie obserwujesz lata musi być LCM liczb od 1 do n
Aby znaleźć LCM liczb od 1 do n - 
 

  1. Zainicjuj ans = 1. 
     
  2. Iteruj po wszystkich liczbach od i = 1 do i = n. 
    W i-tej iteracji odp = LCM(1 2 …….. i) . Można to zrobić łatwo jako LCM(1 2….i) = LCM(ans i)
    Zatem w pierwszej iteracji musimy po prostu zrobić - 
     
ans = LCM(ans i) = ans * i / gcd(ans i) [Using the below property a*b = gcd(ab) * lcm(ab)]


Notatka : W kodzie C++ odpowiedź szybko przekracza limit liczb całkowitych, nawet długi, długi limit.
Poniżej znajduje się implementacja logiki. 
 



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(ba%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(ba%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(ba%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 ?> 

Wyjście
232792560

Złożoność czasowa: O(n log2n) ponieważ złożoność _gcd(ab) w C++ wynosi log2n  i jest ona wykonywana n razy w pętli.
Przestrzeń pomocnicza: O(1)
Powyższe rozwiązanie działa dobrze dla pojedynczego wejścia. Ale jeśli mamy wiele danych wejściowych, dobrym pomysłem jest użycie Sita Eratostenesa do przechowywania wszystkich czynników pierwszych. Zapoznaj się z poniższym artykułem dotyczącym podejścia opartego na sicie. 

Podejście: [Używając Sito Eratostenesa ]

Aby rozwiązać problem znalezienia najmniejszej liczby podzielnej przez pierwsze „n” liczb w bardziej efektywny sposób, możemy użyć sita Eratostenesa do wstępnego obliczenia liczb pierwszych aż do „n”. Następnie możemy użyć tych liczb pierwszych do bardziej efektywnego obliczenia najmniejszej wspólnej wielokrotności (LCM), biorąc pod uwagę najwyższe potęgi każdej liczby pierwszej, które są mniejsze lub równe „n”.

Podejście krok po kroku:

  • Generuj liczby pierwsze do n: Użyj sita Eratostenesa, aby znaleźć wszystkie liczby pierwsze aż do „n”.
  • Oblicz LCM za pomocą tych liczb pierwszych: Dla każdej liczby pierwszej określ największą potęgę tej liczby pierwszej, która jest mniejsza lub równa „n”. Pomnóż te najwyższe potęgi przez siebie, aby uzyskać LCM

Poniżej znajduje się implementacja powyższego podejścia:

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)); 

Wyjście
The smallest number divisible by all numbers from 1 to 20 is 232792560 

Złożoność czasowa: O(nloglog)
Przestrzeń pomocnicza: NA)