ניתן מספר נ מצא את המספר הקטן ביותר המתחלק באופן שווה בכל מספר 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 -
- אתחול ans = 1.
- חזור על כל המספרים מ-i = 1 עד i = n.
באיטרציה ה-I ans = LCM(1 2 …….. i) . זה יכול להיעשות בקלות כמו LCM(1 2 …. i) = LCM(ans 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(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 ?> תְפוּקָה
232792560
מורכבות זמן: O(n log2n) מכיוון שהמורכבות של _gcd(ab) ב-c++ היא log2n והוא פועל n פעמים בלולאה.
מרחב עזר: O(1)
הפתרון לעיל עובד מצוין עבור קלט בודד. אבל אם יש לנו מספר כניסות, זה רעיון טוב להשתמש במסננת של Eratosthenes כדי לאחסן את כל הגורמים הראשוניים. אנא עיין במאמר שלהלן עבור גישה מבוססת מסננת.
גישה: [באמצעות מסננת של ארוטוסטנס ]
כדי לפתור את הבעיה של מציאת המספר הקטן ביותר המתחלק במספרי 'n' הראשונים בצורה יעילה יותר נוכל להשתמש במסננת של ארוטוסטנס כדי לחשב מראש את המספרים הראשוניים עד ל-'n'. לאחר מכן נוכל להשתמש בנקודות ראשוניות אלה כדי לחשב את הכפולה הפחות משותפת (LCM) בצורה יעילה יותר על ידי התחשבות בחזקות הגבוהות ביותר של כל ראשוני שהן קטנות או שווה ל-'n'.
גישה צעד אחר צעד:
- צור מספרים ראשוניים עד n: השתמש במסננת של Eratosthenes כדי למצוא את כל המספרים הראשוניים עד '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
מורכבות זמן: O(nlogn)
מרחב עזר: עַל)