给定一个大小为N的数组arr[] ,任务是找到给定数组中所有数字的不同质因数。
例子:
Input: N = 3, arr[] = {12, 15, 18}
Output: 2 3 5
Explanation:
12 = 2 x 2 x 3
15 = 3 x 5
18 = 2 x 3 x 3
Distinct prime factors among the given numbers are 2, 3, 5.
Input: N = 9, arr[] = {2, 3, 4, 5, 6, 7, 8, 9, 10}
Output: 2 3 5 7
朴素方法:这个问题的一个简单方法是找到数组中每个数字的质因数。然后在这些质因数中找出不同的质数。
时间复杂度: O(N 2 )
有效的方法:一种有效的方法是首先使用埃拉托色尼筛法找到达到给定极限的所有素数,并将它们存储在一个数组中。对于素数数组中的每个素数,检查输入数组中的任何数是否可整除。如果它是可整除的,则将该质数存储在答案数组中。最后,在对给定输入数组中的所有数字重复此过程后返回答案数组。
下面是上述方法的实现:
C++14
#include
using namespace std;
//cppimplementation of the above approach
//Function to return an array
//of prime numbers upto n
//using Sieve of Eratosthenes
vector sieve(int n){
vector prime (n + 1,0);
int p = 2;
while(p * p<= n){
if(prime[p]== 0){
for (int i=2*p;i allPrimes;
for (int i =2;i distPrime(vector arr, vector allPrimes){
//Creating an empty array
//to store distinct prime factors
vector list1;
//Iterating through all the
//prime numbers and check if
//any of the prime numbers is a
//factor of the given input array
for (int i : allPrimes){
for (int j :arr){
if(j % i == 0){
list1.push_back(i);
break;
}
}
}
return list1;
}
//Driver code
int main()
{
//Finding prime numbers upto 10000
//using Sieve of Eratosthenes
vector allPrimes = sieve(10000);
vector arr = {15, 30, 60};
vector ans = distPrime(arr, allPrimes);
cout<<"[";
for(int i:ans) cout<
Java
// Java implementation of the above approach
import java.util.*;
class GFG
{
// Function to return an array
// of prime numbers upto n
// using Sieve of Eratosthenes
static ArrayList sieve(int n){
ArrayList prime = new ArrayList();
for(int i = 0; i < n + 1; i++)
prime.add(0);
int p = 2;
while(p * p <= n){
if(prime.get(p) == 0){
for (int i = 2 * p; i < n + 1; i += p)
prime.set(i, 1);
}
p += 1;
}
ArrayList allPrimes = new ArrayList();
for (int i = 2; i < n; i++){
if (prime.get(i) == 0)
allPrimes.add(i);
}
return allPrimes;
}
// Function to return distinct
// prime factors from the given array
static ArrayList distPrime(ArrayList arr,
ArrayList allPrimes){
// Creating an empty array
// to store distinct prime factors
ArrayList list1 = new ArrayList();
// Iterating through all the
// prime numbers and check if
// any of the prime numbers is a
// factor of the given input array
for (int i = 0; i < allPrimes.size(); i++){
for (int j = 0; j < arr.size(); j++){
if(arr.get(j) % allPrimes.get(i) == 0){
list1.add(allPrimes.get(i));
break;
}
}
}
return list1;
}
// Driver code
public static void main(String args[])
{
// Finding prime numbers upto 10000
// using Sieve of Eratosthenes
ArrayList allPrimes = new ArrayList(sieve(10000));
ArrayList arr = new ArrayList();
arr.add(15);
arr.add(30);
arr.add(60);
ArrayList ans = new ArrayList(distPrime(arr, allPrimes));
System.out.print("[");
for(int i = 0; i < ans.size(); i++)
System.out.print(ans.get(i) + " ");
System.out.print("]");
}
}
// This code is contributed by Surendra_Gangwar
Python3
# Python3 implementation of the above approach
# Function to return an array
# of prime numbers upto n
# using Sieve of Eratosthenes
def sieve(n):
prime =[True]*(n + 1)
p = 2
while(p * p<= n):
if(prime[p] == True):
for i in range(p * p, n + 1, p):
prime[i] = False
p += 1
allPrimes = [x for x in range(2, n)if prime[x]]
return allPrimes
# Function to return distinct
# prime factors from the given array
def distPrime(arr, allPrimes):
# Creating an empty array
# to store distinct prime factors
list1 = list()
# Iterating through all the
# prime numbers and check if
# any of the prime numbers is a
# factor of the given input array
for i in allPrimes:
for j in arr:
if(j % i == 0):
list1.append(i)
break
return list1
# Driver code
if __name__=="__main__":
# Finding prime numbers upto 10000
# using Sieve of Eratosthenes
allPrimes = seive(10000)
arr = [15, 30, 60]
ans = distPrime(arr, allPrimes)
print(ans)
# This code is contributed by mohit kumar 29
C#
// C# implementation of the above approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to return an array
// of prime numbers upto n
// using Sieve of Eratosthenes
static List seive(int n)
{
List prime = new List();
for(int i = 0; i < n + 1; i++)
prime.Add(0);
int p = 2;
while(p * p <= n)
{
if(prime[p] == 0)
{
for (int i = 2 * p; i < n + 1; i += p)
prime[i]= 1;
}
p += 1;
}
List allPrimes = new List();
for (int i = 2; i < n; i++){
if (prime[i] == 0)
allPrimes.Add(i);
}
return allPrimes;
}
// Function to return distinct
// prime factors from the given array
static List distPrime(List arr,
List allPrimes){
// Creating an empty array
// to store distinct prime factors
List list1 = new List();
// Iterating through all the
// prime numbers and check if
// any of the prime numbers is a
// factor of the given input array
for (int i = 0; i < allPrimes.Count; i++){
for (int j = 0; j < arr.Count; j++){
if(arr[j] % allPrimes[i] == 0){
list1.Add(allPrimes[i]);
break;
}
}
}
return list1;
}
// Driver code
public static void Main(string []args)
{
// Finding prime numbers upto 10000
// using Sieve of Eratosthenes
List allPrimes = new List(sieve(10000));
List arr = new List();
arr.Add(15);
arr.Add(30);
arr.Add(60);
List ans = new List(distPrime(arr, allPrimes));
Console.Write("[");
for(int i = 0; i < ans.Count; i++)
Console.Write(ans[i] + " ");
Console.Write("]");
}
}
// This code is contributed by chitranayal
Javascript
输出:
[2, 3, 5]
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live