C语言和C++中求两个数的最大公约数有多种实现方式,比如辗转相除法、穷举法、更相减损术、质因数分解法等。
辗转相除法
辗转相除法是一种比较常用的求两个数的最大公约数的算法,它的基本思想是:用较大的数除以较小的数,再用除数除以出现的余数,如此重复,直到余数是0为止,此时被除数即为两数的最大公约数。
int gcd(int a, int b)
{
int c;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
穷举法
穷举法是一种比较简单的求两个数的最大公约数的算法,它的基本思想是:从两个数中较小的那个数开始,一直递减到1,每次减1,判断这两个数是否都能被这个数整除,如果都能被整除,则该数就是两数的最大公约数。
int gcd(int a, int b)
{
int c;
c = (a < b) ? a : b;
while (c > 0)
{
if (a % c == 0 && b % c == 0)
break;
c--;
}
return c;
}
更相减损术
更相减损术也是一种比较常用的求两个数的最大公约数的算法,它的基本思想是:用较大的数减去较小的数,把差代替较大的数,继续用较小的数减去差,如此重复,直到差为0为止,此时较小的数即为两数的最大公约数。
int gcd(int a, int b)
{
int c;
while (b != 0)
{
c = a - b;
a = (c > b) ? c : b;
b = (c > b) ? b : c;
}
return a;
}
质因数分解法
质因数分解法是一种比较简单的求两个数的最大公约数的算法,它的基本思想是:将两个数都分解为质因数的乘积,求出两个数中公有的质因数,将这些公有的质因数相乘,即可得到两个数的最大公约数。
int gcd(int a, int b)
{
int c;
c = a;
while (c > 1)
{
if (a % c == 0 && b % c == 0)
break;
c--;
}
return c;
}