📜  两个数的共同素数

📅  最后修改于: 2021-05-06 21:53:42             🧑  作者: Mango

给定两个整数AB ,任务是找到这些数字的公质数。

例子:

天真的方法:1迭代到min(A,B)并检查i是否是素数以及AB的因数,如果是,则显示数字。

有效的方法是执行以下操作:

  1. 查找给定数字的最大公约数(gcd)。
  2. 查找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