5.C++: 求最大公约数,最小公倍数。
作者:互联网
1.辗转相除法求最大公约数(greatest common divisor)
2.更相减损术求最小公约数
改进:更相减损术是不稳定的算法,当两个数相差悬殊时,如10000和1的最大公约数,要递归9999次。
做法;
当a和b都是偶数时,gcd(a,b)=2*gcd(a/2,b/2)=2*gcd(a>>1,b>>1)。
当a是奇数,b是偶数时,gcd(a,b)=gcd(a,b/2)=gcd(a,b>>1)。
当a是偶数,b是奇数时,gcd(a,b)=gcd(a/2,b)=gcd(a>>1,b)。
当a和b都是奇数数时,gcd(a,b)=gcd(a-b,b)。
算法复杂度:
辗转相除法:O(log(max(a,b)))
更相减损法:O(max(a,b))
改进更相减损法:O(log(max(a,b)))
参考自https://www.cnblogs.com/developing/articles/11295551.html
3.求最小公倍数
算出x,y最大公约数m,得最小公倍数x*y/m。
标签:gcd,更相,公倍数,max,C++,减损,最大公约数 来源: https://www.cnblogs.com/NKHTH/p/14165485.html