求给定 Array 的所有非素数的 GCD
给定一个包含N个整数的数组arr[] ,任务是找到数组中所有非素数的GCD 。如果所有数字都是素数,则返回-1。
例子:
Input: N = 3, arr[ ] = {2, 3, 5}
Output: -1
Explanation: All the numbers are prime.
Hence answer will be -1.
Input: N = 6, arr[ ] = { 2, 4, 6, 12, 3, 5 }
Output: 2
Explanation: Non-prime numbers present in the array are 4, 6, and 12.
Their GCD is 2.
方法:这个问题可以通过使用埃拉托色尼筛法找到数组中的素数来解决。
请按照以下步骤解决问题:
- 使用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)