标签:lap alt pen div 除法 text 素数 公约数 col
已知a、b求a与b的最大公因数与最小公倍数?
先说最大公因数
一种正常的算法是把a、b改写成多个素数的幂相乘。比如a=36和b=54,那么a=2^2*3^2,b=2^1*3^3。最大公因数就是取相同的素数的最小指数相乘,即2^1*3^2=18。亲爱的wyt理解这个就行了,下面可以不用看。
再来说说辗转相除法。它是用a、b中的大数对小数取余,再把余数和小数中的较小数取余,一直这样做,直到刚好整除,余数为0。比如36与54,先算54%36=18,再算36%18=0,结束,这里的18即为所求。
int a,b; int zhanzhuan(int x,int y) { if(x%y==0) return y; else return zhanzhuan(y,x%y); } int main() { cin>>a>>b; cout<<zhanzhuan(max(a,b),min(a,b)); }
然后是更相减损术,这个算法是把a、b中的大数减小数,然后把小数与差中的大数减小数,直到减到减数和差一样,此时的差即为所求。
比如36与54,先算54-36=18,再算36-18=18,此时18=18,18就是最大公因数了。
int a,b; int gengxiang(int x,int y) { while(x!=y) { if(x>y) x=x-y; else y=y-x; } return x; } int main() { cin>>a>>b; cout<<gengxiang(max(a,b),min(a,b)); }
这样我会的方法就没了。
然后再说最小公倍数。
一种正常的算法是把a、b改写成多个素数的幂相乘。比如a=36和b=54,那么a=2^2*3^2,b=2^1*3^3。最小公倍数就是取所有的素数的最大指数相乘,即2^2*3^3=108。不用怀疑我就是从上面粘贴的,为什么能粘贴呢?其实看看这俩方法就可以发现,ab作为两个数,最小公倍数最大公因数一个取最大指数一个取最小指数,那么每一个数分解出的素数的幂肯定都取到两个数中了,那么就有
最小公倍数*最大公约数=a*b
这样求最小公倍数和求最大公约数就是同一个问题了,你还不会么?
标签:lap alt pen div 除法 text 素数 公约数 col
原文地址:https://www.cnblogs.com/qywyt/p/9024161.html