LeetCode每日一刷 2427

文章介绍了两种计算两个正整数a和b公因子数量的方法。第一种是从1遍历到较小值,检查每个数是否能整除a和b。第二种方法更优化,只遍历到a和b的最大公约数的平方根,利用除数成对出现的性质减少计算次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共因子的数量

给你两个正整数 a 和 b ,返回 a 和 b 的  因子的数目。

如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。

解法一:

        偏暴力的解法,从1开始遍历,一直到min(a, b),若遍历到的数值i可以整除a和b,则数量加1;   

    int commonFactors(int a, int b) {
        int ans = 0;

        for (auto i = 1; i <= min(a, b); ++i)
        {
            if (a % i == 0 && b % i == 0) ++ans;
        }

        return ans;
    }

解法二:

        解法1的做法从1遍历到a,b中的最小值,这样会浪费一些性能,因为只需要遍历到a和b的最大公约数即可。同时除数都是成对存在的,比如2和3均为6的除数,所以我们进一步减少遍历次数,只需要从1遍历到sqrt(gcd(a, b))。若遍历到的数值不为sqrt(gcd(a, b)),则+2,否则+1;

    int commonFactors(int a, int b) {
        int ans = 0;
        int g = gcd(a, b);

        for (auto i = 1; i <= sqrt(g); ++i)
        {
            if (g % i == 0)
            {
                cout << i << endl;
                if (i * i != g) ans += 2;
                else ++ans;
            }
        }

        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值