ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《算法基础》最大公约数

2022-03-19 10:59:04  阅读:186  来源: 互联网

标签:return min int 基础 算法 最大公约数 cont 分母


目录

1、LeetCode——1979. 找出数组的最大公约数

 2、LeetCode——LCP 02. 分式化简


1、LeetCode——1979. 找出数组的最大公约数

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。

两个数的 最大公约数 是能够被两个数整除的最大正整数。

思路:先给数组排好序,然后直接求最大值和最小值的最大公约数

代码及详情:

// qsort排序需要的函数
int cmp(const void* a, const void* b){
    return *(int*)a - *(int*)b;
}
// 求最大公约数函数
int gcd(int a, int b) {
    return !b ? a : gcd(b, a % b);
}
int findGCD(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    int min = nums[0];
    int max = nums[numsSize - 1];

    // 迭代法求公约数
    // while(min){
    //     int t = max % min;
    //     max = min;
    //     min = t;
    // }
    // return max;

    return gcd(min,max);
}

 2、LeetCode——LCP 02. 分式化简

有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?

连分数是形如上图的分式。在本题中,所有系数都是大于等于0的整数。

输入的cont代表连分数的系数(cont[0]代表上图的a0,以此类推)。返回一个长度为2的数组[n, m],使得连分数的值等于n / m,且n, m最大公约数为1。

 思路:将数组从后往前遍历计算,先计算出通分后的分子,在把分子分母颠倒进行下一次循环计算,最后退出循环时再手动颠倒以下分子分母的位置。

代码及详情:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 // 就是即将要加的整数乘以分母再加上分子,等到加下一个元素的时候,再颠倒一下分子和分母。 
 // 当然了,最后一次执行,分子和分母没有颠倒,所以最后再颠倒一次
int* fraction(int* cont, int contSize, int* returnSize){
    int* ans = (int*)malloc(sizeof(int) * 2);
    int c = 1;  // 分子
    int d = cont[contSize - 1];  // 分母
    for(int i = contSize - 1; i > 0; i--){
        // 计算出同分后的分子,也就是下一次的分母
        c = cont[i - 1] * d + c;
        // 颠倒分母分子
        int temp = c;
        c = d;
        d = temp;
    }
    ans[0] = d;
    ans[1] = c;
    *returnSize = 2;
    return ans;
}

文首图片素材取自博客《算法零基础100讲》(第14讲) 最小公倍数_英雄哪里出来的博客-CSDN博客

标签:return,min,int,基础,算法,最大公约数,cont,分母
来源: https://blog.csdn.net/weixin_46263870/article/details/123590252

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有