欧几里得算法(辗转相除法)求最大公约数。最小公倍数

本文介绍了如何使用辗转相除法求解两个整数a和b的最大公约数(gcd),以及如何通过最大公约数计算最小公倍数(lcm)。通过质数分解和去除冗余来确保最小公倍数的最小性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.最大公约数

辗转相除法:求a和b(a>b)的最大公约数,就等同于求 b 和 a mod b的最大公约数。

即为公式:gcd(a,b) ==> gcd(b,a%b) 

推论:

        (1)如果存在一个数d, d|a(d能整除a) 并且 d|b,那么就可以推导出 d|(a+b) 。进一步可以得到 ==> d|(xa+yb)  x,y都是正整数。

d是a和b的最大公约数,现在要求得d也是b和a%b的最大公约数

对于公式 gcd(b,a%b),a%b 可以转换为  ==> a-(a/b)*b , a/b为整数部分,忽略小数。(例如3/2==>1,抛弃0.5)

也就是说 gcd(b,a%b) 可以转换为 ==> gcd(b , a-(a/b)*b)

a,b最大公约数为d(d能整除a,d能整除b),那么通过(1)可以得到 d 也能整除 a-(a/b)*b(x为1,y为-a/b)。因此d是b和a%b的最大公约数。

例如:

        a=12,b=8,存在一个d为a,b的最大公约数

        gcd(12,8) ==> gcd(8,12%8) ==> gcd(8,12-8) 因为 12除以d为整数,8除以d也为整数,所以4能整除8,所以4就是最大公约数

public static int gcd(int a,int b){
    return b>0?gcd(b,a%b):a;
}

2.最小公倍数

a,b的最小公倍数等于a,b的乘积除以他们的最大公约数

        最小公倍数也就是能被a和b整除的最小的数。a*b得到的数是倍数但是不一定是最小的公倍数。要怎么保证这个乘积是最小的公倍数?通过去除公共约数就行。

如:a=12,b=8。c=a*b=96。

        a分解成质数为2^2*3^1

        b分解成质数为2^3

        c分解成质数为2^5*3^1

        c要能被a,b整除,只需要c能刚好满足他们包含的质数就行了,也就是c只要有2^3*3^1。但是c的质数2比a和b的质数2都多了,这部分就是冗余的。只要去除冗余部分就能得到最小公倍数了。而这个冗余部分就是最大公约数。

public static int lcm(int a,int b){
    int gcd = gcd(a, b);
    return a/gcd*b;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值