《算法零基础100讲》(第13讲) 最大公约数[题解]

1979. 找出数组的最大公约数

在这里插入图片描述

分析:

  1. 首先遍历数组nums,找到max和min
  2. 求gcd(max, min)

然后如何实现函数gcd呢,实现gcd有两种办法。

  1. 遍历出min约数,并判断该数是否能整除max,从而找出最大的公约数。
    代码:
int gcd(int max, int min){
    
    
	int ret = 0;
	for(int i = 1; i <= min; i++){
    
    
		if(min % i == 0 && max % i == 0){
    
    
			ret = i;
		}
	}
	return ret;
}
  1. 优化,通过分析我们可以得出一个式子,min = [max / min] max + max % min,如果max % min = 0,则说明min就是最大的公约数,否则,我们设a为min, b为max, k为[max / min],如果c是a和b的一个公约数,那么a - kb也是他们的一个公约数,得:
gcd(a, b) = gcd(b, a % b)
代码:
int gcd(int a, int b){
    
    
    return !b ? a : gcd(b, a % b); 
}

int findGCD(int* nums, int numsSize){
    
    
    int max = INT_MIN;
    int min = INT_MAX;
    for(int i = 0; i < numsSize; i++){
    
    
        if(max < nums[i]){
    
    
            max = nums[i];
        }
        if(min > nums[i]){
    
    
            min = nums[i];
        }
    }
    return gcd(max, min % max);
}

Guess you like

Origin blog.csdn.net/qq_53060585/article/details/121095440