Leetcode[6279]. 数组乘积中的不同质因数数目
1.题目
给你一个正整数数组 nums
,对 nums
所有元素求积之后,找出并返回乘积中 不同质因数 的数目。
注意:
- 质数 是指大于
1
且仅能被1
及自身整除的数字。 - 如果
val2 / val1
是一个整数,则整数val1
是另一个整数val2
的一个因数。
示例 1:
输入:nums = [2,4,3,7,10,6]
输出:4
解释:
nums 中所有元素的乘积是:2 * 4 * 3 * 7 * 10 * 6 = 10080 = 25 * 32 * 5 * 7 。
共有 4 个不同的质因数,所以返回 4 。
示例 2:
输入:nums = [2,4,8,16]
输出:1
解释:
nums 中所有元素的乘积是:2 * 4 * 8 * 16 = 1024 = 210 。
共有 1 个不同的质因数,所以返回 1 。
提示:
1 <= nums.length <= 104
2 <= nums[i] <= 1000
2.思路
这道题目主要是如何求一个整数的质因数,很基础的算法,但是我还不怎么会,特写下来记录一下。
首先判断一个数是否是质数,需要进行对这个数的开方处理。然后进行1~这个开方进行除运算,若能整除则不是质数。
具体代码见is_primer
3.代码
class Solution {
public:
int is_prime(int n)
{
int x=sqrt(n);
for(int i=2;i<=x;i++)
{
if(n%i==0)//不是质数
return 0;
}
return 1;//是质数
}
int distinctPrimeFactors(vector<int>& nums) {
int res=0;
vector<int> v;
int n=nums.size();
for(int i=0;i<n;i++)
{
int m=nums[i];
for(int j=2;j<=m;j++)//求这个数所有的质因数
{
if(j!=2 && j%2==0)
continue;
if(m%j==0 && is_prime(j))//j是其中的一个质因数,满足即是质数又是因数的条件
{
vector<int>::iterator it=find(v.begin(),v.end(),j);
if(it == v.end())//如果里面没有这个质数,则加入进去
{
v.emplace_back(j);
}
}
}
}
return v.size();
}
};