求最大公约(因)数

求最大公约数

1. 枚举法

  • 如果两个数是负数,则需要将其转化为正数。
  • 找到两个数中最小的那个,min
  • 从(min ~ 1)递减的枚举方式比从(1 ~ ming)递增的方式,效率更高。
  • 循环判断min是否为两个数的约数。如果是,min就是最大公约数,break;如果不是,–min,continue。
  • 其中将min做为while()的条件,是因为如果min == 0,不进入循环。否则,如果输入的两个数中,不会出现0的话,完全可以使用while(1),因为至少会在min == 1时,break出循环。
//greatest common divisor
int gcd(int x, int y)
{
	if (x < 0)
		x = -x;
	if (y < 0)
		y = -y;

	int min = x;
	if (y < x)
		min = y;
		
	while (min)
	{
		if (x % min == 0 && y % min == 0)
		{
			break;
		}
		--min;
	}

	return min;
}

2.辗转相除

  • 如果两个数中有一个是0的话,返回0
  • 如果两个数是负数,则需要将其转化为正数。
  • 找到两个数中最下的min,和最大的max
  • 得到min除以max的余数rem,在让max = min,min = rem。如果除数min为0了,那么max就是其最大公约数。即:gcd(max ,min)== gcd(min, max%min)
int gcd(int x, int y)
{
	if (x == 0 || y == 0)
		return 0;

	if (x < 0)
		x = -x;
	if (y < 0)
		y = -y;

	int max = x, min = y;
	if (x < y)
	{
		max = y;
		min = x;
	}

	while (min != 0)
	{
		int rem = max % min;
		max = min;
		min = rem;
	}
	return max;
}

3.更相减损法

  • 如果两个数中有一个是0的话,返回0
  • 如果两个数是负数,则需要将其转化为正数。
  • 找到两个数中最下的min,和最大的max
  • 得到max减min的差dif,在让max = min,min = dif。如果减数min为0了,那么max就是其最大公约数。即:gcd(max ,min)== gcd(min, max-min)
int gcd(int x, int y)
{
	if (x == 0 || y == 0)
		return 0;

	if (x < 0)
		x = -x;
	if (y < 0)
		y = -y;

	int max = x, min = y;
	if (x < y)
	{
		max = y;
		min = x;
	}

	while (min != 0)
	{
		int dif = max - min;
		max = min;
		min = dif;
	}

	return max;
}

4.其他

我不确定,对于计算两个数的最大公倍数时,需补需要考虑到0和负数的情况。可以看情况而定,如果确认不会又0和负数,则可以省略前的某些处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值