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

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

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


🌈个人主页:主页链接


🌈算法专栏:专栏链接


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


🌈LeetCode专栏:专栏链接


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


🌈代码仓库:Gitee链接


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



题目:公因子的数目


f5690fa0539b4942a546cee2a63f5f77.png


题解:


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


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


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


代码实现:


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再相乘得到



54d1f7860d8b46be96c2174b663b23a2.jpg


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


7ac951e2f9ee4d60adad64fe3f2bbd5f.jpg


                             质因数可以由此方法得到:先判断这个数能否 被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. 公因子的数目】已经结束。


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


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


🌈诸君,山顶见!

目录
相关文章
|
6月前
|
算法 测试技术 C#
区间合并|LeetCode2963:统计好分割方案的数目
区间合并|LeetCode2963:统计好分割方案的数目
|
6月前
|
算法 测试技术 C#
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【贪心算法】LeetCode2071:你可以安排的最多任务数目
|
6月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
6月前
leetcode-1601:最多可达成的换楼请求数目
leetcode-1601:最多可达成的换楼请求数目
44 0
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
4月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
32 0
|
6月前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
6月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
55 0
|
6月前
|
算法 测试技术 C#
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
|
6月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
32 0