[解题报告]【第24题】给定 a 和 b,求它们的最小公倍数 | 最小公倍数 和 最大公约数有什么关系呢?


零、写在前面

这个系列不经常更新,今天我尝试使用markdown来编辑这些内容完善这部分的所有题解吧。
【第24题】给定 a 和 b,求它们的最小公倍数 | 最小公倍数 和 最大公约数有什么关系呢?


一、主要知识点

最大公倍数和最小公倍数的关系

最小公倍数

求最小公倍数的方法

int gcd(int a, int b) {	//辗转相除法求最大公约数
    if(!b) {
        return a;          
    }
    return gcd(b, a % b);   
}
int main() {
    int a, b;
    while(scanf("%d %d", &a, &b) != EOF) {
        printf("%d\n", a / gcd(a, b) * b);   // 两者乘积除最大公约数可以得到最小公倍数
    } 
    return 0;
}

二、课后习题

1819. 序列中不同最大公约数的数目

题目链接

给你一个由正整数组成的数组 nums 。
数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。

解题思路

首先,每个元素必然是一个一个子序列中的公约数
然后从1到最大来判断是否是某个子序列的公约数
其中判断i是否是某个子序列的公约数的时候就是 判断i 、2i、3i…max的公约数是否是i 因为这个序列的公约数必有i 元素越来越多的时候公约数应该越来越小,保证公约数最小的时候是i就是 如果不是就不是

int gcd(int a, int b){
    return !b ? a : gcd( b , a % b);
}
int countDifferentSubsequenceGCDs(int* nums, int numsSize){
    bool f[200001] = {0};
    int max = 0 , ans = 0;

    for(int i = 0;i < numsSize;++i){
        if(nums[i] > max) max = nums[i];//确定最大值
        if(!f[nums[i]]){
            ans ++; //将每个元素加进去
            f[nums[i]]++;
        }
    }

    for(int i = 1;i <= max;++i){
        if(f[i]) continue;  //已加入元素
        int g = 0,j;          //0和任何数求最大公约数会得到那个数字 不信你跑跑-.-
        for(j = i; j <= max;j += i){
            if(f[j]){
                g = gcd(j,g); //求最大的公约数
                if(g == i)  break;
            }
        }
        if(g == i) ans++;
    }

    return ans;
}

结束


写在最后

最近刷题刷的太乱了,得找找自己的方向了。而且要准备考试,所以最近的文章之后题解了。等到两周后我再回来0.0

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingleiGao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值