Divisores comunes de dos números

Dados dos números enteros, la tarea es encontrar el conteo de todos los divisores comunes de números dados.

Ejemplos: 

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

Se recomienda hacer referencia a todos los divisores de un número dado como requisito previo de este artículo. 

Solución ingenua 
Una solución simple es primero encontrar todos los divisores del primer número y almacenarlos en una array o hash. Luego encuentra los divisores comunes del segundo número y guárdalos. Finalmente imprima elementos comunes de dos arrays almacenadas o hash. La clave es que la magnitud de las potencias de los factores primos de un divisor debe ser igual a la potencia mínima de dos factores primos de a y b.

  • Encuentre los factores primos de a usando la descomposición en factores primos .
  • Encuentre el recuento de cada factor primo de a y guárdelo en un Hashmap.
  • Prime factorice b usando distintos factores primos de a .
  • Entonces el número total de divisores sería igual al producto de (cuenta + 1) 
    de cada factor.
  • cuenta es el mínimo de cuentas de cada factor primo de a y b.
  • Esto da la cuenta de todos los divisores de a y b .

C++

// C++ implementation of program
#include <bits/stdc++.h>
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(a,b)
    {
 
        // 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((values,keys)=>{
            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>

Producción: 

6

Complejidad temporal : O(√n log n) 
Espacio auxiliar: O(n)

Solución eficiente: 
una mejor solución es calcular el máximo común divisor (mcd) de dos números dados y luego contar los divisores de ese mcd. 

C++

// C++ implementation of program
#include <bits/stdc++.h>
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(1,int(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
// 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>

Producción :  

6

Complejidad temporal: O(n 1/2 ) donde n es el mcd de dos números.
Espacio Auxiliar: O(1)

Este artículo es una contribución de Aarti_Rathi y Shashank Mishra (Gullu) . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *