最大公约数分析:
1.暴力法
取min(a,b)暴力循环,O(min(a,b));
2.辗转相除法,来回辗转,直到余0,但是取模性能较差
const gcd = (a, b) = (0 == b ? a : gcd(b, a % b))
这个还是很有必要背下来的
3.更相减损术,来回相减,最后两数相等。运算次数太多
4.更相减损术优化:
当a和b均为偶数时,gcd(a,b) = 2×gcd(a/2, b/2) = 2×gcd(a>>1,b>>1)。
当a为偶数,b为奇数时,gcd(a,b) = gcd(a/2,b) = gcd(a>>1,b)。
当a为奇数,b为偶数时,gcd(a,b) = gcd(a,b/2) = gcd(a,b>>1)。
当a和b均为奇数时,先利用更相减损术运算一次,gcd(a,b) = gcd(b,a-b),此 时a-b必然是偶数,然后又可以继续进行移位运算。
引用《漫画算法》这本书真的是太棒了。
嗯。。。直接贴代码
int gcd(int a,