求最大公因数与最小公倍数

一、最大公因数
1.辗转相除法,又称欧几里得算法。用于计算两个正整数a,b的最大公因数和最小公倍数,其依赖于gcd(a,b) = a (b=0)和gcd(b,a mod b) (b!=0).
2.穷举法,也叫枚举法,求最大公约数时从两者中较小的数开始,由大到小列举,直到找到第一个公因数为止。
3.更相减损法,若两个正整数都为偶数,则用2约简,直到不能约简为止。然后用大数减小数,将差与较小的数比较,再以大数减小数,直到减数和差相等为止。
4. Stein算法,两个数均为偶数时有公因数2,且公因数一定为偶数。一个奇数一个偶数时,因为其奇偶性的不同,所以其最大公因数一定为奇数。当两个数均为奇数时,其最大公因数一定是奇数。
二、流程图
在这里插入图片描述欧几里得算法 / 辗转相除法
在这里插入图片描述
穷举法 / 枚举法
在这里插入图片描述
更相减损法
在这里插入图片描述
Stein算法

三、代码展示

//求最小公因数

//欧几里得算法 / 辗转相除法
//第一种
int lcd(int a, int b)
{
	int t;
	while(a%b!=0)
	{
		t = a;
		a = b;
		b = t%b;
	}
	return b;
}
//第二种
int gcd(int a,int b)
{
    if(a<b)
    {
        int t;
        t=a;
        a=b;
        b=t;
    }
    int m;
    while(b!=0)
    {
        m=a%b;
        a=b;
        b=m;
    }
    return a;
}

//函数递归调用
int gcd(int a, int b) {
	if (a % b == 0) {
		return b;
	}
	else {
		return gcd(b, a % b);
	}
}

//穷举法
int divisor1(int a, int b) {
	int temp;
	temp = (a > b) ? b : a;   //求较小值
	while (temp > 0) {
		if (a % temp == 0 && b % temp == 0) {
			break;
		}
		else {
			temp--;
		}
	}
	return (temp);
}

//更相减损法
int gcd1(int a, int b) {
	int i = 0, temp, x = 0;
	while (a % 2 == 0 && b % 2 == 0) {    //m,n有公约数2时
		a /= 2;
		b /= 2;
		i += 1;
	}
	//a,b的值互换
	if (a < b) {
		temp = a;
		a = b;
		b = temp;
	}
	while (x) {
		x = a - b;
		a = (b > x) ? b : x;   
		b = (b < x) ? b : x;
		if (b == (a - b)) {    //差和减数相等
			break;
		}
	}
	if (i == 0) {
		return b;
	}
	else {
		return (int)pow(2, i)*b;
	}
}


//最小公倍数

//第一种:穷举法
int multiple1(int a, int b) {
	int p, q, temp;
	p = (a > b) ? a : b;  //求两数中的最大值
	q = (a > b) ? b : a;  //求两数中的最小值
	temp = p;
	while (1) {
		if (p % q == 0) {
			break;
		}
		else {
			p += temp;
		}
	}
	return (p);
}
//第二种 枚举
int main()
{
 	while (cin >> a >> b) 
 	{
        for (i = b; i <= a * b; i++)
        {
            if (i%a == 0 && i%b == 0)
            {
                printf("%d\n", i);
                break;
            }
        }
    }
}
//第三种:最小公倍数=a*b/最大公因数

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值