Задата два цела броја задатак је пронаћи број свих заједничких делилаца датих бројева?
Примери:
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 Заједнички делиоци Покушајте!
Препоручује се упућивање сви делиоци датог броја као предуслов овог члана.
Наиве Солутион
Једноставно решење је да прво пронађете све делиоце првог броја и ускладиштите их у низ или хеш. Затим пронађите заједничке делиоце другог броја и сачувајте их. На крају одштампајте заједничке елементе два ускладиштена низа или хеш. Кључно је да величина потенција простих чинилаца делиоца треба да буде једнака минималној снази два проста фактора а и б.
- Пронађите основне факторе коришћења почетна факторизација .
- Пронађите број сваког простог фактора од а и сачувајте га у Хасхмапу.
- Примена факторизације б користећи различите основне факторе од а .
- Тада би укупан број делилаца био једнак производу од (број + 1)
сваког фактора. - Ово даје број свих делилаца од а и б . 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
Временска сложеност : О(?н лог н)
Помоћни простор: О(н)
Ефикасно решење -
Боље решење је израчунавање највећи заједнички делилац (гцд) дата два броја, а затим броји делиоце тог гцд.
// 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
Временска сложеност: О(н1/2) где је н гцд два броја.
Помоћни простор: О(1)
Други приступ:
1. Дефинишите функцију 'гцд' која узима два цела броја 'а' и 'б' и враћа њихов највећи заједнички делилац (ГЦД) коришћењем Еуклидовог алгоритма.
2. Дефинишите функцију 'цоунт_цоммон_дивисорс' која узима два цела броја 'а' и 'б' и броји број заједничких делилаца 'а' и 'б' користећи њихов ГЦД.
3. Израчунајте ГЦД од 'а' и 'б' користећи функцију 'гцд'.
4. Иницијализирајте бројач 'цоунт' на 0.
5. Пређите кроз све могуће делиоце ГЦД од 'а' и 'б' од 1 до квадратног корена ГЦД-а.
6. Ако тренутни делилац дели ГЦД равномерно повећајте бројач за 2 (јер су и 'а' и 'б' дељиви делиоцем).
7. Ако је квадрат тренутног делиоца једнак ГЦД, смањите бројач за 1 (јер смо овај делилац већ једном пребројали).
8. Врати коначни број заједничких делилаца.
9. У главној функцији дефинишите два цела броја 'а' и 'б' и позовите функцију 'цоунт_цоммон_дивисорс' са овим целим бројевима.
10. Одштампајте број заједничких делилаца 'а' и 'б' користећи функцију принтф.
#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.
Временска сложеност функције гцд() је О(лог(мин(а б))) јер користи Еуклидов алгоритам који узима логаритамско време у односу на мањи од два броја.
Временска сложеност функције цоунт_цоммон_дивисорс() је О(скрт(гцд(а б))) јер се понавља до квадратног корена гцд два броја.
Просторна сложеност обе функције је О(1) јер користе само константну количину меморије без обзира на величину улаза.