给你一个整数数组
nums
,返回数组中最大数和最小数的 最大公约数 。两个数的 最大公约数 是能够被两个数整除的最大正整数。
思路:
(1)分别找出最大值和最小值;
(2)利用辗转相除法求最大公约数并返回;
int gcd(int a,int b){ return !b?a:gcd(b,a%b); } int findGCD(int* nums, int numsSize){ int i; int a=0,b=nums[0]; for(i=0;i<numsSize;++i){ a=fmax(a,nums[i]); b=fmin(b,nums[i]); } int ans = gcd(b,a); return ans; }
有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?
思路:
(1)从数组最后一个数从后往前计算;
(2)当用1除数时,将已经计算的的分子和分母进行翻转;
(3)这题不需要约分,本来就是最简
int* fraction(int* cont, int contSize, int* returnSize){ int i,temp; *returnSize = 2; int *ret = (int*)malloc(sizeof(int)*2); ret[0] = 1; ret[1] = cont[contSize-1]; if(contSize==1){ temp = ret[0]; ret[0] = ret[1]; ret[1] = temp; return ret; } for(i=contSize-2;i>=0;--i){ ret[0]+=cont[i]*ret[1]; if(i>0){ temp = ret[0]; ret[0] = ret[1]; ret[1] = temp;} } return ret; }
给你一个由正整数组成的数组 nums 。
数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。
例如,序列 [4,6,16] 的最大公约数是 2 。
数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。
例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。
计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目 。
思路:
(1)标记这个元素是否在序列中是否出现
(2)找到数组里的最大值m
(3)再枚举1到m之间的数做为公约数
(4)检测所有 ii的倍数是否在数组中存在,并且计算这些数的最大公约数;
(5) 如果最大公约数正好为 i, 说明这就是我们想找的最大公约数,计数器加一
#define maxn 200001 int has[maxn]; int gcd(int a, int b) { return !b ? a : gcd(b, a%b); } int countDifferentSubsequenceGCDs(int* nums, int numsSize){ int i, j, t, m = 0, ans = 0; memset(has, 0, sizeof(has)); for(i = 0; i < numsSize; ++i) { has[ nums[i] ] = 1; m =fmax(m, nums[i]); } for(i = 1; i <= m; ++i) { t = 0; for(j = i; j <= m; j += i) { if(has[j]) t = gcd(t, j); } if(t == i) ++ans; } return ans; }
求最大公约数的方法:求最大公约数_1219忆梦的博客-CSDN博客