📌  相关文章
📜  求给定 Array 的所有非素数的 GCD

📅  最后修改于: 2022-05-13 01:56:05.603000             🧑  作者: Mango

求给定 Array 的所有非素数的 GCD

给定一个包含N个整数的数组arr[] ,任务是找到数组中所有非素数的GCD 。如果所有数字都是素数,则返回-1。

例子:

方法:这个问题可以通过使用埃拉托色尼筛法找到数组中的素数来解决。

请按照以下步骤解决问题:

  • 使用Eratosthenes 的筛子找出数组最小值和数组最大值范围内的所有素数。
  • 现在遍历给定的数组并找到非质数。
  • 取所有非质数的 GCD。

下面是上述方法的实现:

C++
// C++ code to implement the approach
 
#include 
using namespace std;
 
vector isPrime(100001, 1);
 
// Function to find the prime numbers
void sieve(int n)
{
    // Mark 0 and 1 as non-prime
    isPrime[0] = 0;
    isPrime[1] = 0;
 
    // Mark all multiples of 2 as
    // non-prime
    for (int i = 4; i <= n; i += 2)
        isPrime[i] = 0;
 
    // Mark all non-prime numbers
    for (int i = 3; i * i <= n; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= n;
                 j += i)
                isPrime[j] = 0;
        }
    }
}
 
// Find the GCD of the non-prime numbers
int nonPrimeGCD(vector& arr, int n)
{
    int i = 0;
 
    // Find all non-prime numbers till n
    // using sieve of Eratosthenes
    sieve(n);
 
    // Find first non - prime number
    // in the array
    while (isPrime[arr[i]] and i < n)
        i++;
 
    // If not found return -1
    if (i == n)
        return -1;
 
    // Initialize GCD as the first
    // non prime number
    int gcd = arr[i];
 
    // Take gcd of all non-prime numbers
    for (int j = i + 1; j < n; j++) {
        if (!isPrime[arr[j]])
            gcd = __gcd(gcd, arr[j]);
    }
    return gcd;
}
 
// Driver code
int main()
{
    int N = 6;
    vector arr = { 2, 4, 6, 12, 3, 5 };
 
    // Find non Prime GCD
    cout << nonPrimeGCD(arr, N);
    return 0;
}


输出
2

时间复杂度: O(N * log(log( N )))
辅助空间: O(N)