力扣——2427. 公因子的数目
2427. 公因子的数目
给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。
如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。
示例 1:
输入:a = 12, b = 6
输出:4
解释:12 和 6 的公因子是 1、2、3、6 。
示例 2:
输入:a = 25, b = 30
输出:2
解释:25 和 30 的公因子是 1、5 。
提示:
1 <= a, b <= 1000
问题解析
暴力做法
我们分别求出a和b的全部因子,可以用哈希表存下a的因子,当找到b的因子的时候,看看哈希表内部能不能找到它,如果可以则计数器++。
时间复杂度:O(a+b);
代码
class Solution {
public:
int commonFactors(int a, int b) {
unordered_map<int,int>mymap;
int cnt=0;
for(int i=1;i<=a;i++)
{
if(a%i==0)
mymap[i]=1;
}
for(int i=1;i<=a;i++)
{
if(b%i==0&&mymap.count(i))
cnt++;
}
return cnt;
}
};
优化做法1
我们可以不用分别求出a和b的因子,我们可以同时求,当枚举的数能同时整除a和b时,计数器++。
时间复杂度:O(min(a,b));
代码
class Solution {
public:
int commonFactors(int a, int b) {
int cnt=0;
for(int i=1;i<=min(a,b);i++)
{
if(b%i==0&&a%i==0)
cnt++;
}
return cnt;
}
};
优化做法3
如果i是a和b的公因子,那么也一定是a和b的最大公约数的因子。
我们可以只枚举到min(a,b)的最大公约数g。
事实上,当我们求一个数的全部因子时,没有必要从1枚举到那个数本身。因为因子是成对存在的,即如果a是num的因子,那么num/a肯定也是num的因子。
那么我们就只枚举到a和b的最大公约数的平方根就行。
时间复杂度:O(sqrt(gcd(a,b)));
代码
class Solution {
public:
int commonFactors(int a, int b) {
int ans = 0, g = __gcd(a, b);
for(int i = 1; i <= g/i; i++) {
if(a%i == 0 && b%i == 0) {
ans++;
if(i*i != g) ans++;
}
}
return ans;
}
};