给定一个整数数组。让我们说 P 是数组元素的乘积。找出乘积 P 的不同质因数的个数。
例子:
Input : 1 2 3 4 5
Output : 3
Explanation: Here P = 1 * 2 * 3 * 4 * 5 = 120. Distinct prime divisors of 120 are 2, 3 and 5. So, the output is 3.
Input : 21 30 15 24 16
Output : 4
Explanation: Here P = 21 * 30 * 15 * 24 * 16 = 3628800. Distinct prime divisors of 3628800 are 2, 3, 5 and 7. So, the output is 4.
天真的方法:
该问题的简单解决方案是将数组中的每个数字相乘,然后找到乘积的不同质因数的数量。
但是这种方法会导致整数溢出。
更好的方法:
为了避免溢出而不是将数字相乘,我们可以分别找到每个元素的质因数,并将这些质因数存储在集合或唯一因数的映射中。
C++
// C++ program to count distinct prime
// factors of a number.
#include
using namespace std;
// Function to count the number of distinct prime
// factors of product of array
int Distinct_Prime_factors(vector a)
{
// use set to store distinct factors
unordered_set 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 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 a)
{
// use set to store distinct factors
HashSet m = new HashSet();
// 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 a = new Vector();
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# 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 a)
{
// use set to store distinct factors
HashSet m = new HashSet();
// 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 a = new List();
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
Javascript
输出 :
3