logo

Divizori comuni ai două numere

Având în vedere două numere întregi, sarcina este de a găsi numărul tuturor divizorilor comuni ai numerelor date?

Exemple:  

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 4
Recommended Practice Divizori comuni Încearcă!

Este recomandat să faceți referire toți divizorii unui număr dat ca o condiție prealabilă a acestui articol. 



Soluție naivă  
O soluție simplă este să găsiți mai întâi toți divizorii primului număr și să-i stocați într-o matrice sau hash. Apoi găsiți divizori comuni ai al doilea număr și stocați-i. În cele din urmă, imprimați elemente comune ale două matrice stocate sau hash. Cheia este că mărimea puterilor factorilor primi ai unui divizor ar trebui să fie egală cu puterea minimă a doi factori primi ai a și b.

  • Găsiți factorii primi ai unei utilizări factorizarea primelor .
  • Aflați numărul fiecărui factor prim al o și stocați-l într-un Hashmap.
  • Factorizare primă b folosind factori primi diferiți ai o .
  • Atunci numărul total de divizori ar fi egal cu produsul lui (număr + 1) 
    a fiecărui factor.
  • contaeste minimul de numărări a fiecărui factor prim al o şi b.
  • Aceasta oferă numărul tuturor divizorilor de o şi 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> 

Ieșire:  

6

Complexitatea timpului : O(?n log n) 
Spațiu auxiliar: Pe)


Soluție eficientă - 
O soluție mai bună este calcularea cel mai mare divizor comun (mcd) a două numere date și apoi numărați divizorii acelui mcd. 

C++
// 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> 

Ieșire:   

6

Complexitatea timpului: Pe1/2) unde n este mcd a două numere.
Spațiu auxiliar: O(1)

O altă abordare:

1. Definiți o funcție „mcd” care ia două numere întregi „a” și „b” și returnează cel mai mare divizor comun al acestora (GCD) folosind algoritmul euclidian.
2. Definiți o funcție „count_common_divisors” care ia două numere întregi „a” și „b” și numără numărul de divizori comuni ai „a” și „b” folosind GCD-ul lor.
3. Calculați GCD-ul lui „a” și „b” folosind funcția „gcd”.
4. Inițializați un contor „numărătoare” la 0.
5. Buclă prin toți divizorii posibili ai MCD ai lui „a” și „b” de la 1 la rădăcina pătrată a MCD.
6. Dacă divizorul curent împarte GCD-ul în mod egal, creșteți contorul cu 2 (deoarece atât „a” cât și „b” sunt divizibile cu divizor).
7. Dacă pătratul divizorului curent este egal cu GCD, reduceți contorul cu 1 (pentru că am numărat deja acest divizor o dată).
8. Întoarceți numărul final al divizorilor comuni.
9. În funcția principal definiți două numere întregi „a” și „b” și apelați funcția „count_common_divisors” cu aceste numere întregi.
10. Tipăriți numărul de divizori comuni ai lui „a” și „b” folosind funcția printf.

C
#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}.`); 

Ieșire
The number of common divisors of 12 and 18 is 4.

Complexitatea de timp a funcției gcd() este O(log(min(a b))), deoarece folosește algoritmul lui Euclid care ia timp logaritmic față de cel mai mic dintre cele două numere.

Complexitatea de timp a funcției count_common_divisors() este O(sqrt(gcd(a b))) deoarece iterează până la rădăcina pătrată a mcd-ului celor două numere.

Complexitatea spațială a ambelor funcții este O(1), deoarece folosesc doar o cantitate constantă de memorie, indiferent de dimensiunea de intrare.