📜  计算两个数字的公质数

📅  最后修改于: 2021-05-31 16:50:27             🧑  作者: Mango

给定两个整数A  B  ,任务是找到两个素数为素数的公因数的计数。
例子:

天真的方法:1迭代到min(A,B)并检查i是否是素数以及AB的因数,如果是,则递增计数器。
有效的方法是执行以下操作:

  1. 查找给定数字的最大公约数(gcd)。
  2. 查找GCD的主要因素。

下面是上述方法的实现:

C++
// CPP program to count common prime factors
// of a and b.
#include 
using namespace std;
 
// A function to count all prime factors of
// a given number x
int countPrimeFactors(int x)
{
    int res = 0;
    if (x % 2 == 0) {
        res++;
 
        // Print the number of 2s that divide x
        while (x % 2 == 0)
            x = x / 2;
    }
 
    // x must be odd at this point.  So we
    // can skip one element (Note i = i +2)
    for (int i = 3; i <= sqrt(x); i = i + 2) {
        if (x % i == 0) {
 
            // While i divides x, print i and
            // divide x
            res++;
            while (x % i == 0)
                x = x / i;
        }
    }
 
    // This condition is to handle the case
    // when x is a prime number greater than 2
    if (x > 2)
        res++;
    return res;
}
 
// Count of common prime factors
int countCommonPrimeFactors(int a, int b)
{
    // Get the GCD of the given numbers
    int gcd = __gcd(a, b);
 
    // Count prime factors in GCD
    return countPrimeFactors(gcd);
}
 
// Driver code
int main()
{
    int a = 6, b = 12;
    cout << countCommonPrimeFactors(a, b);
    return 0;
}


Java
// Java  program to count common prime factors
 // of a and b.
 
import java.io.*;
 
class GFG {
    // Recursive function to return gcd of a and b
    static int __gcd(int a, int b)
    {
        // Everything divides 0 
        if (a == 0)
          return b;
        if (b == 0)
          return a;
        
        // base case
        if (a == b)
            return a;
        
        // a is greater
        if (a > b)
            return __gcd(a-b, b);
        return __gcd(a, b-a);
    }
// A function to count all prime factors of
// a given number x
 static int countPrimeFactors(int x)
{
    int res = 0;
    if (x % 2 == 0) {
        res++;
 
        // Print the number of 2s that divide x
        while (x % 2 == 0)
            x = x / 2;
    }
 
    // x must be odd at this point. So we
    // can skip one element (Note i = i +2)
    for (int i = 3; i <= Math.sqrt(x); i = i + 2) {
        if (x % i == 0) {
 
            // While i divides x, print i and
            // divide x
            res++;
            while (x % i == 0)
                x = x / i;
        }
    }
 
    // This condition is to handle the case
    // when x is a prime number greater than 2
    if (x > 2)
        res++;
    return res;
}
 
// Count of common prime factors
static int countCommonPrimeFactors(int a, int b)
{
    // Get the GCD of the given numbers
    int gcd = __gcd(a, b);
 
    // Count prime factors in GCD
    return countPrimeFactors(gcd);
}
 
// Driver code
 
 
    public static void main (String[] args) {
    int a = 6, b = 12;
    System.out.println(countCommonPrimeFactors(a, b));
    }
}
// This code is contributed by inder_verma..


Python3
# Python 3 program to count common prime
# factors of a and b.
from math import sqrt,gcd
 
# A function to count all prime
# factors of a given number x
def countPrimeFactors(x):
    res = 0
    if (x % 2 == 0):
        res += 1
 
        # Print the number of 2s that divide x
        while (x % 2 == 0):
            x = x / 2
 
    # x must be odd at this point. So we
    # can skip one element (Note i = i +2)
    k = int(sqrt(x)) + 1
    for i in range(3, k, 2):
        if (x % i == 0):
             
            # While i divides x, print i
            # and divide x
            res += 1
            while (x % i == 0):
                x = x / i
     
    # This condition is to handle the
    # case when x is a prime number
    # greater than 2
    if (x > 2):
        res += 1
    return res
 
# Count of common prime factors
def countCommonPrimeFactors(a, b):
     
    # Get the GCD of the given numbers
    gcd__ = gcd(a, b)
 
    # Count prime factors in GCD
    return countPrimeFactors(gcd__)
 
# Driver code
if __name__ == '__main__':
    a = 6
    b = 12
    print(countCommonPrimeFactors(a, b))
     
# This code is contributed by
# Surendra_Gangwar


C#
// C# program to count common prime factors
// of a and b.
 
using System ;
 
class GFG {
    // Recursive function to return gcd of a and b
    static int __gcd(int a, int b)
    {
        // Everything divides 0
        if (a == 0)
        return b;
        if (b == 0)
        return a;
         
        // base case
        if (a == b)
            return a;
         
        // a is greater
        if (a > b)
            return __gcd(a-b, b);
        return __gcd(a, b-a);
    }
    // A function to count all prime factors of
    // a given number x
    static int countPrimeFactors(int x)
    {
        int res = 0;
        if (x % 2 == 0) {
            res++;
     
            // Print the number of 2s that divide x
            while (x % 2 == 0)
                x = x / 2;
        }
     
        // x must be odd at this point. So we
        // can skip one element (Note i = i +2)
        for (int i = 3; i <= Math.Sqrt(x); i = i + 2) {
            if (x % i == 0) {
     
                // While i divides x, print i and
                // divide x
                res++;
                while (x % i == 0)
                    x = x / i;
            }
        }
     
        // This condition is to handle the case
        // when x is a prime number greater than 2
        if (x > 2)
            res++;
        return res;
    }
     
    // Count of common prime factors
    static int countCommonPrimeFactors(int a, int b)
    {
        // Get the GCD of the given numbers
        int gcd = __gcd(a, b);
     
        // Count prime factors in GCD
        return countPrimeFactors(gcd);
    }
     
    // Driver code
    public static void Main() {
    int a = 6, b = 12;
     
    Console.WriteLine(countCommonPrimeFactors(a, b));
    }
    // This code is contributed by Ryuga
}


PHP
 $b)
        return __gcd(($a - $b), $b);
    return __gcd($a, ($b - $a));
}
 
// A function to count all prime
// factors of a given number x
function countPrimeFactors($x)
{
    $res = 0;
    if ($x % 2 == 0)
    {
        $res++;
 
        // Print the number of 2s that
        // divide x
        while ($x % 2 == 0)
            $x = $x / 2;
    }
 
    // x must be odd at this point. So we
    // can skip one element (Note i = i +2)
    for ($i = 3; $i <= sqrt($x); $i = $i + 2)
    {
        if ($x % $i == 0)
        {
 
            // While i divides x, print i
            // and divide x
            $res++;
            while ($x % $i == 0)
                $x = $x / $i;
        }
    }
 
    // This condition is to handle the case
    // when x is a prime number greater than 2
    if ($x > 2)
        $res++;
    return $res;
}
 
// Count of common prime factors
function countCommonPrimeFactors($a, $b)
{
    // Get the GCD of the given numbers
    $gcd = __gcd($a, $b);
 
    // Count prime factors in GCD
    return countPrimeFactors($gcd);
}
 
// Driver code
$a = 6;
$b = 12;
 
echo (countCommonPrimeFactors($a, $b));
 
// This code is contributed by akt_mit..
?>


Javascript


输出:
2

如果存在多个查询来计算公共除数,我们可以使用素因数O(log n)进行质数分解来进一步优化上述代码,以进行多个查询