力扣——2427. 公因子的数目

127 阅读1分钟

力扣——2427. 公因子的数目

2427. 公因子的数目

给你两个正整数 ab ,返回 ab 因子的数目。

如果 x 可以同时整除 ab ,则认为 xab 的一个 公因子

示例 1:

输入:a = 12, b = 6
输出:4
解释:126 的公因子是 1236

示例 2:

输入:a = 25, b = 30
输出:2
解释:2530 的公因子是 15

提示:

  • 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;
    }
};