题⽬描述:
给你⼀个整数数组 nums ,返回数组中最⼤数和最⼩数的 最⼤公约数 。
两个数的 最⼤公约数 是能够被两个数整除的最⼤正整数
• ⽰例 1:
输⼊:nums = [2,5,6,9,10]
输出:2
解释:
nums 中最⼩的数是 2
nums 中最⼤的数是 10
2 和 10 的最⼤公约数是 2
• ⽰例 3:
输⼊:nums = [3,3]
输出:3
解释:
nums 中最⼩的数是 3
nums 中最⼤的数是 3
3 和 3 的最⼤公约数是 3
• 提⽰:
2 <= nums.length <= 1000 1 <= nums[i] <= 1000
算法思路:
1. 定义两个变量 max 和 min 分别记录最⼤值和最⼩值,将其初始化为数组中第⼀个数;
2. 遍历数组,更新最⼤值和最⼩值;
3. 以最⼩值为上限,1为下限从⼤到⼩遍历每个整数;
4. 当遍历到某个数可以同时整除两个最值时,返回此值;
5. 因为不是每个路径都有返回值,编译器会报错,因此在函数最后需返回⼀个与函数返回值类型对 应的值。
- int findGCD(int* num, int numSize)
- {
- int i = 0;
- //假设第⼀个数就是最⼤
- int max = *num;
- //假设第⼀个数就是最⼤
- int min = *num;
- //找出数组最⼤值和最⼩值
- for (i = 0; i < numSize; i++) {
- if (max < num[i])
- max = num[i];
- if (min > num[i])
- min = num[i];
- }
- //遍历求最⼤公约数
- for (i = min; i >= 1; i--) {
- if (max % i == 0 && min % i == 0) {
- return i;
- }
- }
- //防⽌编译错误
- return -1;
- }
算法思路:
1. 定义两个变量 max 和 min 分别记录最⼤值和最⼩值,将其初始化为数组中第⼀个数;
2. 遍历数组,更新最⼤值和最⼩值;
3. 利⽤辗转相除法求出最⼤公约数 n ;
4. 返回最⼤公约数 n 。
- //辗转相除法循环实现
- int gcd(int max, int min) {
- int r = 0;
- //当最⼩值不能整除最⼤值,即r≠0,更新两个最值重复步骤
- while (r = max % min) {
- max = min;
- min = r;
- }
- //当前最⼩值即为原数最⼤公约数
- return min;
- }
- //辗转相除法递归实现
- int gcd2(int a, int b) {
- //特判最⼩值为0时的情况
- if (b == 0) {
- return a;
- }
- //返回b和r的最⼤公约数
- return gcd(b, a % b);
- }
- int findGCD(int* nums, int numsSize) {
- int i = 0;
- int max = *nums;//假设第⼀个数就是最⼤
- int min = *nums;//假设第⼀个数就是最⼩
- //找出数组最⼤值和最⼩值
- for (i = 1; i < numsSize; i++)
- {
- if (max < nums[i])
- max = nums[i];
- if (min > nums[i])
- min = nums[i];
- }
- //求最⼤公约数
- int n = gcd(max, min);
- return n;
- }