《算法基础》最大公约数
作者:互联网
目录
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