[解题报告]【第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

猜你喜欢

转载自blog.csdn.net/qq_17593855/article/details/121534990
今日推荐