C语言实现最大公约数的辗转相除法和更相减损法

最大公约数:指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。

1.辗转相除法

求两数(A,B)的最大公约数,运用递归进行计算:

  1. 当B为0时,则A为其最大公约数
  2. B不为0时,进行取模运算
     

例:求(240,380):

  1. 240÷380=0(余240)→(380,240)
  2. 380÷240=1(余140)→(240,140)
  3. 240÷140=1(余100)→(140,100)
  4. 140÷100=1(余40)→(100,40)
  5. 100÷40=2(余20)→(40,20)
  6. 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.更相减损法

  1. 若两数相等,则最大公约数为该数。
  2. 一奇一偶,两奇:以较大的数减较小的数,接着把所得的差与较小的数比较,若不相等,将减数赋给被减数,差赋给减数。若相等则不执行,则差为最大公约数。
  3. 两偶:对两数同时进行除2操作,并记录次数n,直到某个数不再为偶数为止。再进行,以较大的数减较小的数,接着把所得的差与较小的数比较,若不相等,将减数赋给被减数,差赋给减数,继续执行上述操作。若相等则不执行,最大公约数为差*pow(2,n)

 
 
例:一奇一偶(98,63)

  1. 98-63=35
  2. 63-35=28
  3. 35-28=7
  4. 28-7=21
  5. 21-7=14
  6. 14-7=7(减数和差相等,不用继续执行了)

所以(98,63)的最大公约数为:7。
 
 
例:两偶(240,100)

  1. 240÷2=120,100÷2=50 →n=1
  2. 120÷2=60,50÷2=25 →n=2(此时25不是偶数,不用继续往下除2了)
  3. 60-25=35
  4. 35-25=10
  5. 25-10=15
  6. 15-10=5
  7. 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;
}

结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值