给定两个整数和 ,任务是找到两个素数为素数的公因数的计数。
例子:
Input: A = 6, B = 12
Output: 2
2 and 3 are the only common prime divisors of 6 and 12
Input: A = 4, B = 8
Output: 1
天真的方法:从1迭代到min(A,B)并检查i是否是素数以及A和B的因数,如果是,则递增计数器。
有效的方法是执行以下操作:
- 查找给定数字的最大公约数(gcd)。
- 查找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)进行质数分解来进一步优化上述代码,以进行多个查询