数组乘积的不同质因数

原文:https://www.geeksforgeeks.org/distinct-prime-factors-of-array-product/

给定一个整数数组,让我们说P是数组元素的乘积。 求出乘积P的不同质数的数量。

示例

输入:1 2 3 4 5

输出:3

说明:此处P = 1 * 2 * 3 * 4 * 5 = 120。120 的不同质数是 2、3 和 5。因此,输出为 3。

输入:21 30 15 24 16

输出:4

说明:此处P = 21 * 30 * 15 * 24 * 16 = 3628800。3628800 的不同主要除数分别是 2、3、5 和 7。 输出为 4。

朴素的方法

这个问题的简单解决方案是将数组中的每个数字相乘,然后找到乘积的不同质数。

但是此方法可能导致整数溢出。

更好的方法

为了避免溢出而不是将数字相乘,我们可以分别找到每个元素的质因数,并将质因数存储在一组或唯一图中。

C++

// C++ program to count distinct prime 
// factors of a number. 
#include <bits/stdc++.h> 
using namespace std; 

// Function to count the number of distinct prime 
// factors of product of array 
int Distinct_Prime_factors(vector<int> a) 
{ 
    // use set to store distinct factors 
    unordered_set<int> m; 

    // iterate over every element of array 
    for (int i = 0; i < a.size(); i++) { 
        int sq = sqrt(a[i]); 

        // from 2 to square root of number run 
        // a loop and check the numbers which 
        // are factors. 
        for (int j = 2; j <= sq; j++) { 
            if (a[i] % j == 0) { 

                // if j is a factor store it in the set 
                m.insert(j); 

                // divide the number with j till it 
                // is divisible so that only prime factors 
                // are stored 
                while (a[i] % j == 0) { 
                    a[i] /= j; 
                } 
            } 
        } 

        // if the number is still greater than 1 then 
        // it is a prime factor, insert in set 
        if (a[i] > 1) { 
            m.insert(a[i]); 
        } 
    } 

    // the number of unique prime factors will 
    // the size of the set 
    return m.size(); 
} 

// Driver Function 
int main() 
{ 
    vector<int> a = { 1, 2, 3, 4, 5 }; 
    cout << Distinct_Prime_factors(a) << '\n'; 
    return 0; 
} 

Java

// Java program to count distinct 
// prime factors of a number. 
import java.util.*; 

class GFG { 

    // Function to count the number 
    // of distinct prime factors of 
    // product of array 
    static int Distinct_Prime_factors(Vector<Integer> a) 
    { 
        // use set to store distinct factors 
        HashSet<Integer> m = new HashSet<Integer>(); 

        // iterate over every element of array 
        for (int i = 0; i < a.size(); i++) { 
            int sq = (int)Math.sqrt(a.get(i)); 

            // from 2 to square root of number 
            // run a loop and check the numbers 
            // which are factors. 
            for (int j = 2; j <= sq; j++) { 
                if (a.get(i) % j == 0) { 

                    // if j is a factor store 
                    // it in the set 
                    m.add(j); 

                    // divide the number with j 
                    // till it is divisible so 
                    // that only prime factors 
                    // are stored 
                    while (a.get(i) % j == 0) { 
                        a.set(i, a.get(i) / j); 
                    } 
                } 
            } 

            // if the number is still greater 
            // than 1 then it is a prime factor, 
            // insert in set 
            if (a.get(i) > 1) { 
                m.add(a.get(i)); 
            } 
        } 

        // the number of unique prime 
        // factors will the size of the set 
        return m.size(); 
    } 

    // Driver Code 
    public static void main(String args[]) 
    { 
        Vector<Integer> a = new Vector<Integer>(); 
        a.add(1); 
        a.add(2); 
        a.add(3); 
        a.add(4); 
        a.add(5); 
        System.out.println(Distinct_Prime_factors(a)); 
    } 
} 

// This code is contributed by Arnab Kundu 

Python3

# Python3 program to count distinct  
# prime factors of a number 
import math 

# Function to count the number of distinct  
# prime factors of product of array 
def Distinct_Prime_factors( a): 

    # use set to store distinct factors 
    m = [] 

    # iterate over every element of array 
    for i in range (len(a)) : 
        sq = int(math.sqrt(a[i])) 

        # from 2 to square root of number run  
        # a loop and check the numbers which 
        # are factors. 
        for j in range(2, sq + 1) : 
            if (a[i] % j == 0) : 

                # if j is a factor store  
                # it in the set 
                m.append(j) 

                # divide the number with j till it 
                # is divisible so that only prime  
                # factors are stored 
                while (a[i] % j == 0) : 
                    a[i] //= j 

        # if the number is still greater  
        # than 1 then it is a prime factor, 
        # insert in set 
        if (a[i] > 2) : 
            m.append(a[i]) 

    # the number of unique prime factors  
    # will the size of the set 
    return len(m) 

# Driver Code 
if __name__ == "__main__": 

    a = [ 1, 2, 3, 4, 5 ] 
    print (Distinct_Prime_factors(a)) 

# This code is contributed by ita_c 

```c

## C#

```cs

// C# program to count distinct 
// prime factors of a number. 
using System; 
using System.Collections.Generic; 

class GFG { 

    // Function to count the number 
    // of distinct prime factors of 
    // product of array 
    static int Distinct_Prime_factors(List<int> a) 
    { 
        // use set to store distinct factors 
        HashSet<int> m = new HashSet<int>(); 

        // iterate over every element of array 
        for (int i = 0; i < a.Count; i++) { 
            int sq = (int)Math.Sqrt(a[i]); 

            // from 2 to square root of number 
            // run a loop and check the numbers 
            // which are factors. 
            for (int j = 2; j <= sq; j++) { 
                if (a[i] % j == 0) { 

                    // if j is a factor store 
                    // it in the set 
                    m.Add(j); 

                    // divide the number with j 
                    // till it is divisible so 
                    // that only prime factors 
                    // are stored 
                    while (a[i] % j == 0) { 
                        a[i] = a[i] / j; 
                    } 
                } 
            } 

            // if the number is still greater 
            // than 1 then it is a prime factor, 
            // insert in set 
            if (a[i] > 1) { 
                m.Add(a[i]); 
            } 
        } 

        // the number of unique prime 
        // factors will the size of the set 
        return m.Count; 
    } 

    // Driver Code 
    public static void Main() 
    { 
        List<int> a = new List<int>(); 
        a.Add(1); 
        a.Add(2); 
        a.Add(3); 
        a.Add(4); 
        a.Add(5); 
        Console.WriteLine(Distinct_Prime_factors(a)); 
    } 
} 

// This code is contributed by ihritik 

输出

3