零、写在前面
英雄哪里出来《算法零基础100讲》传送门https://bbs.csdn.net/forums/hero?category=0&typeId=17913https://bbs.csdn.net/forums/hero?category=0&typeId=17913
本题知识回顾
本章主要描述了两个数最大公约数的求法
【第22题】给定 a 和 b,求它们的最大公约数 | 辗转相除法_英雄哪里出来-CSDN博客难度:★★☆☆☆,辗转相除法https://blog.csdn.net/WhereIsHeroFrom/article/details/118272816每天会开启一篇试读文章,每日坚持打卡就可以一直白嫖哦
一、题目
难度简单4
给你一个整数数组
nums
,返回数组中最大数和最小数的 最大公约数 。两个数的 最大公约数 是能够被两个数整除的最大正整数。
示例 1:
输入:nums = [2,5,6,9,10] 输出:2 解释: nums 中最小的数是 2 nums 中最大的数是 10 2 和 10 的最大公约数是 2
力扣https://leetcode-cn.com/problems/find-greatest-common-divisor-of-array/二、解题
思路:按题目要求,1求最大最小值 2设计计算最大公约数的函数 3调用函数,返回结果
其中,计算最大公约数的函数,如果看明白了,本期的知识点,应该就能明白。
通过辗转相除法,求得
证明——辗转相除法
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d,由等式右边可知m=r/d为整数,因此d|r
因此d也是b,a mod b的公约数。
因(a,b)和(b,a mod b)的公约数相等,则其最大公约数也相等,得证。
int Max(int a,int b)
{
return a>b?a:b;
} //取最大值
int Min(int a,int b)
{
return a<b?a:b;
} //取最小值
int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
} //设计计算最大公约数的函数,本期知识点看懂就明白了
int findGCD(int* nums, int numsSize)
{
int max=nums[0],min=nums[0];
for(int i=0;i<numsSize;i++)
{
max=Max(max,nums[i]);
min=Min(min,nums[i]); //循环遍历,找最大值和最小值
}
return gcd(min,max); //调用设计好的求最大公约数的函数,返回结果
}
三、结果