📜  计算两个数字的公质数

📅  最后修改于: 2021-04-26 19:33:42             🧑  作者: Mango

给定两个整数AB ,任务是找到两个素数为素数的公因数的计数。

例子:

天真的方法: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..
?>


输出:
2

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