logo

Il numero più piccolo divisibile per i primi n numeri

Provalo su GfG Practice ' title=

Dato un numero N trovare il numero più piccolo uniformemente divisibile per ciascun numero da 1 a n.
Esempi:  
 

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


Se osservi attentamente il anni deve essere il LCM dei numeri da 1 a n
Per trovare MCM dei numeri da 1 a n - 
 

  1. Inizializza ans = 1. 
     
  2. Iterare su tutti i numeri da i = 1 a i = n. 
    Alla iesima iterazione ans = LCM(1 2 …….. i) . Questo può essere fatto facilmente come LCM(1 2 …. i) = LCM(ans i)
    Quindi all'iterazione dobbiamo solo fare - 
     
ans = LCM(ans i) = ans * i / gcd(ans i) [Using the below property a*b = gcd(ab) * lcm(ab)]


Nota: Nel codice C++ la risposta supera rapidamente il limite intero, anche il limite lungo.
Di seguito è riportata l'implementazione della logica. 
 



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 ?> 

Produzione
232792560

Complessità temporale: O(n log2n) poiché la complessità di _gcd(ab) in C++ è log2n  e viene eseguito n volte in un ciclo.
Spazio ausiliario: O(1)
La soluzione di cui sopra funziona bene per un singolo input. Ma se abbiamo più input è una buona idea utilizzare il Setaccio di Eratostene per memorizzare tutti i fattori primi. Fare riferimento all'articolo di seguito per l'approccio basato sul setaccio. 

Approccio: [Utilizzo Setaccio di Eratostene ]

Per risolvere il problema di trovare il numero più piccolo divisibile per i primi numeri 'n' in modo più efficiente possiamo utilizzare il Setaccio di Eratostene per precalcolare i numeri primi fino a 'n'. Quindi possiamo utilizzare questi numeri primi per calcolare il minimo comune multiplo (LCM) in modo più efficiente considerando le potenze più alte di ciascun numero primo che sono inferiori o uguali a "n".

Approccio passo dopo passo:

  • Genera numeri primi fino a n: Usa il Setaccio di Eratostene per trovare tutti i numeri primi fino a 'n'.
  • Calcola il LCM utilizzando questi numeri primi: Per ogni primo determinare la potenza più alta di quel primo che è inferiore o uguale a 'n'. Moltiplicare insieme questi poteri più alti per ottenere l'LCM

Di seguito è riportata l'implementazione dell'approccio di cui sopra:

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

Produzione
The smallest number divisible by all numbers from 1 to 20 is 232792560 

Complessità temporale: O(nloglogn)
Spazio ausiliario: SU)