Для двох цілих чисел завдання знайти кількість усіх спільних дільників даних чисел?
Приклади:
Input : a = 12 b = 24 Output: 6 // all common divisors are 1 2 3 // 4 6 and 12 Input : a = 3 b = 17 Output: 1 // all common divisors are 1 Input : a = 20 b = 36 Output: 3 // all common divisors are 1 2 4Recommended Practice Загальні дільники Спробуйте!
Рекомендується звернутися всі дільники даного числа як передумова цієї статті.
Наївне рішення
Просте рішення полягає в тому, щоб спочатку знайти всі дільники першого числа та зберегти їх у масиві або хеші. Потім знайдіть спільні дільники другого числа і збережіть їх. Нарешті вивести загальні елементи двох збережених масивів або хешу. Головне, щоб величина степенів простих множників діленого дорівнювала мінімальному степеню двох простих множників a і b.
- Знайдіть прості множники вживання розкладання на прості множники .
- Знайдіть кількість кожного простого множника a і збережіть його в Hashmap.
- Розкласти на прості множники b використовуючи різні прості множники a .
- Тоді загальна кількість дільників дорівнюватиме добутку (рахунок + 1)
кожного фактора. - Це дає кількість усіх дільників a і b . C++
// C++ implementation of program #include using namespace std; // Map to store the count of each // prime factor of a map<int int> ma; // Function that calculate the count of // each prime factor of a number void primeFactorize(int a) { for(int i = 2; i * i <= a; i += 2) { int cnt = 0; while (a % i == 0) { cnt++; a /= i; } ma[i] = cnt; } if (a > 1) { ma[a] = 1; } } // Function to calculate all common // divisors of two given numbers // a b --> input integer numbers int commDiv(int a int b) { // Find count of each prime factor of a primeFactorize(a); // stores number of common divisors int res = 1; // Find the count of prime factors // of b using distinct prime factors of a for(auto m = ma.begin(); m != ma.end(); m++) { int cnt = 0; int key = m->first; int value = m->second; while (b % key == 0) { b /= key; cnt++; } // Prime factor of common divisor // has minimum cnt of both a and b res *= (min(cnt value) + 1); } return res; } // Driver code int main() { int a = 12 b = 24; cout << commDiv(a b) << endl; return 0; } // This code is contributed by divyeshrabadiya07
Java // Java implementation of program import java.util.*; import java.io.*; class GFG { // map to store the count of each prime factor of a static HashMap<Integer Integer> ma = new HashMap<>(); // method that calculate the count of // each prime factor of a number static void primeFactorize(int a) { for (int i = 2; i * i <= a; i += 2) { int cnt = 0; while (a % i == 0) { cnt++; a /= i; } ma.put(i cnt); } if (a > 1) ma.put(a 1); } // method to calculate all common divisors // of two given numbers // a b --> input integer numbers static int commDiv(int a int b) { // Find count of each prime factor of a primeFactorize(a); // stores number of common divisors int res = 1; // Find the count of prime factors of b using // distinct prime factors of a for (Map.Entry<Integer Integer> m : ma.entrySet()) { int cnt = 0; int key = m.getKey(); int value = m.getValue(); while (b % key == 0) { b /= key; cnt++; } // prime factor of common divisor // has minimum cnt of both a and b res *= (Math.min(cnt value) + 1); } return res; } // Driver method public static void main(String args[]) { int a = 12 b = 24; System.out.println(commDiv(a b)); } }
Python3 # Python3 implementation of program import math # Map to store the count of each # prime factor of a ma = {} # Function that calculate the count of # each prime factor of a number def primeFactorize(a): sqt = int(math.sqrt(a)) for i in range(2 sqt 2): cnt = 0 while (a % i == 0): cnt += 1 a /= i ma[i] = cnt if (a > 1): ma[a] = 1 # Function to calculate all common # divisors of two given numbers # a b --> input integer numbers def commDiv(a b): # Find count of each prime factor of a primeFactorize(a) # stores number of common divisors res = 1 # Find the count of prime factors # of b using distinct prime factors of a for key value in ma.items(): cnt = 0 while (b % key == 0): b /= key cnt += 1 # Prime factor of common divisor # has minimum cnt of both a and b res *= (min(cnt value) + 1) return res # Driver code a = 12 b = 24 print(commDiv(a b)) # This code is contributed by Stream_Cipher
C# // C# implementation of program using System; using System.Collections.Generic; class GFG{ // Map to store the count of each // prime factor of a static Dictionary<int int> ma = new Dictionary<int int>(); // Function that calculate the count of // each prime factor of a number static void primeFactorize(int a) { for(int i = 2; i * i <= a; i += 2) { int cnt = 0; while (a % i == 0) { cnt++; a /= i; } ma.Add(i cnt); } if (a > 1) ma.Add(a 1); } // Function to calculate all common // divisors of two given numbers // a b --> input integer numbers static int commDiv(int a int b) { // Find count of each prime factor of a primeFactorize(a); // Stores number of common divisors int res = 1; // Find the count of prime factors // of b using distinct prime factors of a foreach(KeyValuePair<int int> m in ma) { int cnt = 0; int key = m.Key; int value = m.Value; while (b % key == 0) { b /= key; cnt++; } // Prime factor of common divisor // has minimum cnt of both a and b res *= (Math.Min(cnt value) + 1); } return res; } // Driver code static void Main() { int a = 12 b = 24; Console.WriteLine(commDiv(a b)); } } // This code is contributed by divyesh072019
JavaScript <script> // JavaScript implementation of program // Map to store the count of each // prime factor of a let ma = new Map(); // Function that calculate the count of // each prime factor of a number function primeFactorize(a) { for(let i = 2; i * i <= a; i += 2) { let cnt = 0; while (a % i == 0) { cnt++; a = parseInt(a / i 10); } ma.set(i cnt); } if (a > 1) { ma.set(a 1); } } // Function to calculate all common // divisors of two given numbers // a b --> input integer numbers function commDiv(ab) { // Find count of each prime factor of a primeFactorize(a); // stores number of common divisors let res = 1; // Find the count of prime factors // of b using distinct prime factors of a ma.forEach((valueskeys)=>{ let cnt = 0; let key = keys; let value = values; while (b % key == 0) { b = parseInt(b / key 10); cnt++; } // Prime factor of common divisor // has minimum cnt of both a and b res *= (Math.min(cnt value) + 1); }) return res; } // Driver code let a = 12 b = 24; document.write(commDiv(a b)); </script>
Вихід:
6
Часова складність : O(?n log n)
Допоміжний простір: O(n)
Ефективне рішення -
Кращим рішенням є обчислення найбільший спільний дільник (НСД) заданих двох чисел, а потім підрахувати дільники цього НОД.
// C++ implementation of program #include using namespace std; // Function to calculate gcd of two numbers int gcd(int a int b) { if (a == 0) return b; return gcd(b % a a); } // Function to calculate all common divisors // of two given numbers // a b --> input integer numbers int commDiv(int a int b) { // find gcd of a b int n = gcd(a b); // Count divisors of n. int result = 0; for (int i = 1; i <= sqrt(n); i++) { // if 'i' is factor of n if (n % i == 0) { // check if divisors are equal if (n / i == i) result += 1; else result += 2; } } return result; } // Driver program to run the case int main() { int a = 12 b = 24; cout << commDiv(a b); return 0; }
Java // Java implementation of program class Test { // method to calculate gcd of two numbers static int gcd(int a int b) { if (a == 0) return b; return gcd(b % a a); } // method to calculate all common divisors // of two given numbers // a b --> input integer numbers static int commDiv(int a int b) { // find gcd of a b int n = gcd(a b); // Count divisors of n. int result = 0; for (int i = 1; i <= Math.sqrt(n); i++) { // if 'i' is factor of n if (n % i == 0) { // check if divisors are equal if (n / i == i) result += 1; else result += 2; } } return result; } // Driver method public static void main(String args[]) { int a = 12 b = 24; System.out.println(commDiv(a b)); } }
Python3 # Python implementation of program from math import sqrt # Function to calculate gcd of two numbers def gcd(a b): if a == 0: return b return gcd(b % a a) # Function to calculate all common divisors # of two given numbers # a b --> input integer numbers def commDiv(a b): # find GCD of a b n = gcd(a b) # Count divisors of n result = 0 for i in range(1int(sqrt(n))+1): # if i is a factor of n if n % i == 0: # check if divisors are equal if n/i == i: result += 1 else: result += 2 return result # Driver program to run the case if __name__ == '__main__': a = 12 b = 24; print(commDiv(a b))
C# // C# implementation of program using System; class GFG { // method to calculate gcd // of two numbers static int gcd(int a int b) { if (a == 0) return b; return gcd(b % a a); } // method to calculate all // common divisors of two // given numbers a b --> // input integer numbers static int commDiv(int a int b) { // find gcd of a b int n = gcd(a b); // Count divisors of n. int result = 0; for (int i = 1; i <= Math.Sqrt(n); i++) { // if 'i' is factor of n if (n % i == 0) { // check if divisors are equal if (n / i == i) result += 1; else result += 2; } } return result; } // Driver method public static void Main(String[] args) { int a = 12 b = 24; Console.Write(commDiv(a b)); } } // This code contributed by parashar.
PHP // PHP implementation of program // Function to calculate // gcd of two numbers function gcd($a $b) { if ($a == 0) return $b; return gcd($b % $a $a); } // Function to calculate all common // divisors of two given numbers // a b --> input integer numbers function commDiv($a $b) { // find gcd of a b $n = gcd($a $b); // Count divisors of n. $result = 0; for ($i = 1; $i <= sqrt($n); $i++) { // if 'i' is factor of n if ($n % $i == 0) { // check if divisors // are equal if ($n / $i == $i) $result += 1; else $result += 2; } } return $result; } // Driver Code $a = 12; $b = 24; echo(commDiv($a $b)); // This code is contributed by Ajit. ?> JavaScript <script> // Javascript implementation of program // Function to calculate gcd of two numbers function gcd(a b) { if (a == 0) return b; return gcd(b % a a); } // Function to calculate all common divisors // of two given numbers // a b --> input integer numbers function commDiv(a b) { // find gcd of a b let n = gcd(a b); // Count divisors of n. let result = 0; for (let i = 1; i <= Math.sqrt(n); i++) { // if 'i' is factor of n if (n % i == 0) { // check if divisors are equal if (n / i == i) result += 1; else result += 2; } } return result; } let a = 12 b = 24; document.write(commDiv(a b)); </script>
Вихід:
6
Часова складність: O(n1/2), де n — НОД двох чисел.
Допоміжний простір: О(1)
Інший підхід:
1. Визначте функцію «gcd», яка приймає два цілі числа «a» і «b» і повертає їхній найбільший спільний дільник (НСД) за допомогою алгоритму Евкліда.
2. Визначте функцію «count_common_divisors», яка приймає два цілі числа «a» і «b» і підраховує кількість спільних дільників «a» і «b», використовуючи їх НОД.
3. Обчисліть НОД «a» і «b» за допомогою функції «gcd».
4. Ініціалізуйте «лічильник» на 0.
5. Переберіть усі можливі дільники НОД числа 'a' і 'b' від 1 до квадратного кореня з НОД.
6. Якщо поточний дільник рівномірно ділить НОД, збільште лічильник на 2 (оскільки і «a», і «b» діляться на дільник).
7. Якщо квадрат поточного дільника дорівнює НОД, зменшіть лічильник на 1 (оскільки ми вже один раз порахували цей дільник).
8. Повертає остаточну кількість спільних дільників.
9. У основній функції визначте два цілі числа 'a' і 'b' і викличте функцію 'count_common_divisors' з цими цілими числами.
10. Виведіть кількість спільних дільників 'a' і 'b' за допомогою функції printf.
#include int gcd(int a int b) { if(b == 0) { return a; } return gcd(b a % b); } int count_common_divisors(int a int b) { int gcd_ab = gcd(a b); int count = 0; for(int i = 1; i * i <= gcd_ab; i++) { if(gcd_ab % i == 0) { count += 2; if(i * i == gcd_ab) { count--; } } } return count; } int main() { int a = 12; int b = 18; int common_divisors = count_common_divisors(a b); printf('The number of common divisors of %d and %d is %d.n' a b common_divisors); return 0; }
C++ #include using namespace std; int gcd(int a int b) { if(b == 0) { return a; } return gcd(b a % b); } int count_common_divisors(int a int b) { int gcd_ab = gcd(a b); int count = 0; for(int i = 1; i * i <= gcd_ab; i++) { if(gcd_ab % i == 0) { count += 2; if(i * i == gcd_ab) { count--; } } } return count; } int main() { int a = 12; int b = 18; int common_divisors = count_common_divisors(a b); cout<<'The number of common divisors of '<<a<<' and '<<b<<' is '<<common_divisors<<'.'<<endl; return 0; }
Java import java.util.*; public class Main { public static int gcd(int a int b) { if(b == 0) { return a; } return gcd(b a % b); } public static int countCommonDivisors(int a int b) { int gcd_ab = gcd(a b); int count = 0; for(int i = 1; i * i <= gcd_ab; i++) { if(gcd_ab % i == 0) { count += 2; if(i * i == gcd_ab) { count--; } } } return count; } public static void main(String[] args) { int a = 12; int b = 18; int commonDivisors = countCommonDivisors(a b); System.out.println('The number of common divisors of ' + a + ' and ' + b + ' is ' + commonDivisors + '.'); } }
Python3 import math def gcd(a b): if b == 0: return a return gcd(b a % b) def count_common_divisors(a b): gcd_ab = gcd(a b) count = 0 for i in range(1 int(math.sqrt(gcd_ab)) + 1): if gcd_ab % i == 0: count += 2 if i * i == gcd_ab: count -= 1 return count a = 12 b = 18 common_divisors = count_common_divisors(a b) print('The number of common divisors of' a 'and' b 'is' common_divisors '.') # This code is contributed by Prajwal Kandekar
C# using System; public class MainClass { public static int GCD(int a int b) { if (b == 0) { return a; } return GCD(b a % b); } public static int CountCommonDivisors(int a int b) { int gcd_ab = GCD(a b); int count = 0; for (int i = 1; i * i <= gcd_ab; i++) { if (gcd_ab % i == 0) { count += 2; if (i * i == gcd_ab) { count--; } } } return count; } public static void Main() { int a = 12; int b = 18; int commonDivisors = CountCommonDivisors(a b); Console.WriteLine('The number of common divisors of {0} and {1} is {2}.' a b commonDivisors); } }
JavaScript // Function to calculate the greatest common divisor of // two integers a and b using the Euclidean algorithm function gcd(a b) { if(b === 0) { return a; } return gcd(b a % b); } // Function to count the number of common divisors of two integers a and b function count_common_divisors(a b) { let gcd_ab = gcd(a b); let count = 0; for(let i = 1; i * i <= gcd_ab; i++) { if(gcd_ab % i === 0) { count += 2; if(i * i === gcd_ab) { count--; } } } return count; } let a = 12; let b = 18; let common_divisors = count_common_divisors(a b); console.log(`The number of common divisors of ${a} and ${b} is ${common_divisors}.`);
Вихід
The number of common divisors of 12 and 18 is 4.
Часова складність функції gcd() становить O(log(min(a b))), оскільки вона використовує алгоритм Евкліда, який використовує логарифмічний час відносно меншого з двох чисел.
Часова складність функції count_common_divisors() становить O(sqrt(gcd(a b))), оскільки вона виконує ітерації до квадратного кореня з gcd двох чисел.
Складність простору для обох функцій дорівнює O(1), оскільки вони використовують лише постійний обсяг пам’яті незалежно від розміру вхідних даних.