GCD+LCM+唯一分解定理

第一行留给本鸽子精咕咕咕。

第二行——我队友已经学习很久了,我已经玩手机很久了。(我是辣鸡

 

其实很久之前写过gcd的,然而现在回过去看实在是惨不忍睹,一个人的代码竟然可以写的那么丑(虽然我现在写的也不怎么好看)(其实是打算补学数论部分,刚好完善一下gcd和lcm)。

以下为正文:

1.gcd:利用辗转相除法(欧几里得算法)来求最大公约数。

a,b均能整除gcd(a,b)得到a1,b1;
a1,b1均能整除gcd(a1,b1)得到a2,b2;
……
an-2,bn-2均能整除gcd(an-2,bn-2)得到an-1,1;
最后一次取模为an,0,一遍遍递归即可得到最初a,b的最大公约数。

int gcd(int x,int y)
{
    return y == 0?x:gcd(y,x%y);
}

2.利用gcd和唯一分解定理求lcm

什么是唯一分解定理呢?唯一分解定理也叫算术基本定理,由欧几里得提出。定理的内容是:任何一个大于1的自然数N,如果N不为质数,都可以唯一分解成有限个质数的乘积 ,P1~Pn为质数,a1~an为正整数。利用反正法可以证明,此处略过,如有需要,后续再补。

由此,我们可以在唯一分解定理上拓展,当给定两个数a,b时,都可以分解为有限个质数的乘积,若为质数,直接为N = N(指数为1)。

所以,gcd即为a,b两数所有相同质因子最小指数幂的乘积。ex:10 = 2*5,60 = 2^2*3*5,gcd(10,20) = 2^1*5^1 = 10。

而当求lcm时,即为a,b两数所有的质因子的最大指数幂的乘积。ex:10 = 2*5,60 = 2^2*3*5,lcm(10,60)= 2^2*3*5 = 60。

我们可以看出,gcd(a,b)*lcm(a,b) = a*b。即为a,b所有因子的乘积。

所以,求lcm时,可用a*b/gcd(a,b)。不过由于a*b可能溢出,我们采用先除后乘的方式。(不明确的时候函数里用long long比较保险,我写完才想起来,懒得改了)

int gcd(int x,int y)
{
    return y == 0?x:gcd(y,x%y);
}

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

附两个基础练习:SDNU1132 gcd;SDNU1097 lcm。

 

欢迎指出错误qwq

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值