给定两个整数和 ,任务是找到这些数字的公质数。
例子:
Input: A = 6, B = 12
Output: 2 3
2 and 3 are the only common prime divisors of 6 and 12
Input: A = 4, B = 8
Output: 2
天真的方法:从1迭代到min(A,B)并检查i是否是素数以及A和B的因数,如果是,则显示数字。
有效的方法是执行以下操作:
- 查找给定数字的最大公约数(gcd)。
- 查找GCD的主要因素。
多种查询的有效方法:如果有多个针对公共因素的查询,则可以进一步优化上述解决方案。该想法基于使用Sieve O(log n)进行多次查询的素因分解。
下面是上述方法的实现:
C++
// C++ implementation of above approach
#include
using namespace std;
#define MAXN 100001
bool prime[MAXN];
void SieveOfEratosthenes()
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
memset(prime, true, sizeof(prime));
// 0 and 1 are not prime numbers
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= MAXN; p++) {
// If prime[p] is not changed, then it is a prime
if (prime[p] == true) {
// Update all multiples of p as non-prime
for (int i = p * p; i <= MAXN; i += p)
prime[i] = false;
}
}
}
// Find the common prime divisors
void common_prime(int a, int b)
{
// Get the GCD of the given numbers
int gcd = __gcd(a, b);
// Find the prime divisors of the gcd
for (int i = 2; i <= (gcd); i++) {
// If i is prime and a divisor of gcd
if (prime[i] && gcd % i == 0) {
cout << i << " ";
}
}
}
// Driver code
int main()
{
// Create the Seive
SieveOfEratosthenes();
int a = 6, b = 12;
common_prime(a, b);
return 0;
}
Java
//Java implementation of above approach
class GFG {
static final int MAXN = 100001;
static boolean prime[] = new boolean[MAXN];
static void SieveOfEratosthenes()
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
for(int i = 0;i
Python3
# Python implementation of above approach
from math import gcd, sqrt
# Create a boolean array "prime[0..n]"
# and initialize all entries it as true.
# A value in prime[i] will finally be
# false if i is Not a prime, else true.
prime = [True] * 100001
def SieveOfEratosthenes() :
# 0 and 1 are not prime numbers
prime[0] = False
prime[1] = False
for p in range(2, int(sqrt(100001)) + 1) :
# If prime[p] is not changed,
# then it is a prime
if prime[p] == True :
# Update all multiples of
# p as non-prime
for i in range(p**2, 100001, p) :
prime[i] = False
# Find the common prime divisors
def common_prime(a, b) :
# Get the GCD of the given numbers
__gcd = gcd(a, b)
# Find the prime divisors of the gcd
for i in range(2, __gcd + 1) :
# If i is prime and a divisor of gcd
if prime[i] and __gcd % i == 0 :
print(i, end = " ")
# Driver code
if __name__ == "__main__" :
# Create the Seive
SieveOfEratosthenes()
a, b = 6, 12
common_prime(a, b)
# This code is contributed by ANKITRAI1
C#
//C# implementation of above approach
using System;
public class GFG {
static bool []prime = new bool[100001];
static void SieveOfEratosthenes()
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
for(int i = 0;i
输出:
2 3