c语言练习71: 找出数组的最⼤公约数

找出数组的最⼤公约数

题⽬描述:

给你⼀个整数数组 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;
}

你可能感兴趣的:(c语言,算法,数据结构)