最大公约数:指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
1.辗转相除法
求两数(A,B)
的最大公约数,运用递归进行计算:
- 当B为0时,则A为其最大公约数
- B不为0时,进行取模运算
例:求(240,380):
- 240÷380=0(余240)→(380,240)
- 380÷240=1(余140)→(240,140)
- 240÷140=1(余100)→(140,100)
- 140÷100=1(余40)→(100,40)
- 100÷40=2(余20)→(40,20)
- 40÷20=2(余0)→(20,0)
所以(240,380)的最大公约数为:20。
代码:
int Gcd(int A, int B)
{
if (B == 0)
return A;
return Gcd(B, A % B);
}
int main()
{
int A = 240, B = 380;
printf("A 和 B的最大公约数为%d\n", Gcd(A, B));
return 0;
}
结果:
2.更相减损法
- 若两数相等,则最大公约数为该数。
- 一奇一偶,两奇:以较大的数减较小的数,接着把所得的差与较小的数比较,若不相等,将减数赋给被减数,差赋给减数。若相等则不执行,则差为最大公约数。
- 两偶:对两数同时进行除2操作,并记录次数n,直到某个数不再为偶数为止。再进行,以较大的数减较小的数,接着把所得的差与较小的数比较,若不相等,将减数赋给被减数,差赋给减数,继续执行上述操作。若相等则不执行,最大公约数为
差*pow(2,n)
。
例:一奇一偶(98,63)
- 98-63=35
- 63-35=28
- 35-28=7
- 28-7=21
- 21-7=14
- 14-7=7(减数和差相等,不用继续执行了)
所以(98,63)的最大公约数为:7。
例:两偶(240,100)
- 240÷2=120,100÷2=50 →n=1
- 120÷2=60,50÷2=25 →n=2(此时25不是偶数,不用继续往下除2了)
- 60-25=35
- 35-25=10
- 25-10=15
- 15-10=5
- 10-5=5(减数和差相等,不用继续执行了)
所以(240,100)的最大公约数为:5*pow(2,2)= 20。
代码:
int Gcd1(int A, int B, int n)
{
if (A == B)
{
if (n != 0)
return pow(2, n) * A;
return A;
}
else if (A % 2 == 0 && B % 2 == 0)
return Gcd1(A >> 1, B >> 1, ++n);
return Gcd1(abs(A - B), B > A ? A : B, n);
}
int main()
{
int A = 240, B = 380;
printf("A 和 B的最大公约数为%d\n", Gcd1(A, B, 0));
return 0;
}
结果: