#include <iostream>
/** 1.穷举法,确定大小值,用最大最小值对i(有minx到1)进行取模,
* 循环n/2-1,时间复杂度O(n)
*/
int GetMaxCommonDivisor(int a, int b)
{
int i = 0;
int max = a >= b ? a : b;
int min = a < b ? a : b;
if (max % min == 0)
return min;
for (i = min / 2; i >= 1; i--)
{
if (max % i == 0 && min % i == 0)
{
break;
}
}
return i;
}
/** 2.辗转相除法(欧几里得算法),两个正整数a和b(a>b),
* 他们的最大公约数是a除以b的余数c和b之间的最大公约数,用递归
*/
int GetMaxCommonDivisorV1(int a, int b)
{
int max = a >= b ? a : b;
int min = a < b ? a : b;
if (max % min == 0)
return min;
return GetMaxCommonDivisorV1(max % min, min);
}
/**
* 更相减损术,两个正整数a和b(a>b),
* 它们的最大公约数是a-b的差值c和较小值b的最大公约数
* 直到相等,就是最大公约数
*/
int GetMaxCommonDivisorV2(int a, int b)
{
if (a == b)
{
return a;
}
int max = a >= b ? a : b;
int min = a < b ? a : b;
return GetMaxCommonDivisorV2(max - min, min);
}
int main()
{
std::cout << GetMaxCommonDivisor(8, 20) << std::endl;
std::cout << GetMaxCommonDivisorV1(8, 20) << std::endl;
std::cout << GetMaxCommonDivisorV2(8, 20) << std::endl;
}
最大公约数
最新推荐文章于 2022-02-03 09:00:00 发布