题目来源于力扣——1979. 找出数组的最大公约数 - 力扣(LeetCode) (leetcode-cn.com)
这题是力扣所有题目中比较简单的一题,这题可分为两个步骤求解
第一步,找出数组中元素的最大值和最小值
第二步,求解这最大值和最小值的最大公倍数
求最大公约数这里我用了两种方法,一种是暴力求解方法,一种是辗转相除法
这里先用撵转相除法求解
具体的教程可以看我主页的内容哦
辗转相除法_爱编程的晖哥的博客-CSDN博客
#include<stdio.h>
int max_min(int arr[],int sz)
{
int i = 0;
int max = arr[0]; //假设数组的最大值和最小值都是数组第一个元素
int min = arr[0];
for (i = 1; i < sz; i++) //这里的for循环从数组的第二个元素开始循环,因为第一个元素不需要跟自己进行比较
{
if (max < arr[i])
{
max = arr[i]; //求数组的最大值
}
if (min > arr[i]) //求数组的最小值
{
min = arr[i];
}
}
return max_common(max, min); //调用max_common函数求最大公因数,并返回main函数中
}
int max_common(int max, int min)
{
int t = 0;
while (max % min) //撵转相除法
{
t = max % min;
max = min;
min = t;
}
return min;
}
int main()
{
int arr[] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = max_min(arr, sz);
printf("%d", ret);
return 0;
}
如果大家不会辗转相除法,也可以试一下暴力求解
就是假如有两个数,这两个数的公因数一定是小于等于那两个数的较小那一个数的
比如求15和20的最大公因数,这个数肯定是在15以及15以内的,所以我们可以从15开始,设置一个循环,将小于等于15的数都与15和20取模,如果结果等于0,那么那个数就是两个数的最大公约数
注意,是按降序的方式,而不是,不然从1开始的话,那两个数的之间都有公因数1啊,这就不行了
代码如下:
#include<stdio.h>
int max_min(int arr[],int sz)
{
int i = 0;
int max = arr[0];
int min = arr[0];
for (i = 1; i < sz; i++)
{
if (max < arr[i])
{
max = arr[i];
}
if (min > arr[i])
{
min = arr[i];
}
}
return max_common(max, min);
}
int max_common(int max, int min)//max = ,min = 15
{
int m = min;
while (1)
{
if (max % m == 0 && min % m == 0)
{
break; //找到最大公约数就跳出循环
}
m --;
}
return m;
}
int main()
{
int arr[] = { 0 ,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = max_min(arr, sz);
printf("%d", ret);
return 0;
}