📜  两个数的共同除数

📅  最后修改于: 2021-04-29 17:44:41             🧑  作者: Mango

给定两个整数,任务是查找给定数字的所有公因数的计数?

例子 :

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

建议参考给定数字的所有除数作为本文的前提条件。

天真的解决方案
一个简单的解决方案是首先找到所有第一个除数,然后将它们存储在数组或哈希中。然后找到第二个数的公约数并将其存储。最后打印两个存储的数组或哈希的公共元素。关键在于除数的素因子的幂的大小应等于a和b的两个素因子的最小幂。

  • 查找使用素数分解的素数。
  • 找到a的每个素数的计数并将其存储在Hashmap中。
  • 使用一个不同的质因数总理比化
  • 那么除数的总数等于(count + 1)的乘积
    每个因素。
  • countab的每个素的最小值
  • 这给出了ab的所有除数的计数。
C++
// C++ implementation of program
#include 
using namespace std;
 
// Map to store the count of each
// prime factor of a
map 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 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 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 ma = new Dictionary();
 
// 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 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


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(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
 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


输出:

6

高效的解决方案–
更好的解决方案是计算给定两个数字的最大公约数(gcd),然后计算该gcd的公约数。

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(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

 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.
?>

Java脚本


输出 :

6

时间复杂度:O(log(n)+ n 1/2 ),其中n是两个数字的gcd。