LeetCode.每日一题 2427. 公因子的数目

时间:2023-04-06 08:53:15

 LeetCode.每日一题 2427. 公因子的数目

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

????个人主页:主页链接

????算法专栏:专栏链接

     我会一直往里填充内容哒!

????LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

????代码仓库:Gitee链接

????点击关注=收获更多优质内容????

目录

题目:公因子的数目

题解:

代码实现:

 公约数的个数与公约数之和:

完结撒花:

LeetCode.每日一题 2427. 公因子的数目

 

题目:公因子的数目

LeetCode.每日一题 2427. 公因子的数目

题解:

是一题简单题,我们借此来复习下数论里的求最大公约数。

先给出一种解法:暴力枚举

将一个数的所有约数枚举出来,存入数组,之后再用数组中的每一个数,去看看能不能被第二个数整除,若能则答案++

代码实现:

class Solution {
public:
    int commonFactors(int a, int b) {
        vector<int>ans;
        int res=0;
        for(int i=2;i<=a;i++)
        {
            if(a%i==0)ans.push_back(i);
        }
        for(int i=0;i<ans.size();i++)
        {
            if(b%ans[i]==0)res++;
        }   
        return res+1;
    }
};

 还有一种方法,即寻找最大公约数,因为若想成为答案的一部分,每个数的约数一定为其最大公约数的因子.所以就转变成了求最大公约数的约数个数问题.

先来看看如何求最大公约数:

int gcd(int a,int b)
    {
        int c=1;
        while(c)
        {
            c=a%b;
            a=b;
            b=c;
        }
        return a;
    }

求出最大公约数后,就寻找其约数个数

这里简化了一下遍历范围,举一个简单的例子:2*3=6 所以2 3都为6的因子,他们都是成对出现的,所以只需要遍历到2的这一半就可以了.2*2!=6 说明其还有另一半,直接答案++即可.

int commonFactors(int a, int b) {
        int d=gcd(a, b);
        int ans=0;
        for(int i=1;i<=d/i;i++)
        {
            if(d%i==0)
            {
                ans++;
                if(i*i!=d)ans++;
            }
        }
        return ans;
    }

 公约数的个数与公约数之和:

这里简单复习一下,公约数的个数可以由质因数其指数个数+1再相乘得到

LeetCode.每日一题 2427. 公因子的数目

 

                              公约数之和可以由质因数每个指数个数相加再相乘得到

LeetCode.每日一题 2427. 公因子的数目

                               质因数可以由此方法得到:先判断这个数能否 被i整除,若能就一直除到不能被整除为止,记录次数.若最后x>1,则说明还有另一半没有被找到,则这个另一半即为x

#include<iostream>
using namespace std;
void divide(int x)
{
 
    for(int i=2;i<=x/i;i++)
        if(x%i==0)
        {
            int s=0;
            while(x%i==0)
            {
                x/=i;
                s++;
            }
            printf("%d %d\n",i,s);
        }
        if(x>1)printf("%d %d\n",x,1);
        puts("");
        return ;
}
int main()
{
    int n=0;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        divide(x);
    }
    return 0;
}

完结撒花:

????本篇博客的内容【LeetCode.每日一题 2427. 公因子的数目】已经结束。

????若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

????若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

????诸君,山顶见!