1.求两个数a和b的最大公约数
解析:使用【辗转相除法】又名【欧几里得算法】
定理:两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数c和b之间的最大公约数。
辗转相除法:依据以上定力,对a和b进行递归取求最大公约数。
function getGreatestCommonDivisor(a, b) {
let big = a > b ? a : b;
let small = a < b ? a : b;
let remainder = big % small;
if (remainder == 0) {
return small;
}
return getGreatestCommonDivisor(remainder, small);
}
时间复杂度:很小(我也不知道怎么表示😄)
2.判断一个数是否为2的整数次幂
解析:2的整数次幂的二进制表示法,除首位是1其他位都是0,弱对其减1,则所有位都是1
10进制a | 2进制b | -1后的2进制c | b & c |
2 | 10 | 0 | 0 |
4 | 100 | 11 | 0 |
8 | 1000 | 111 | 0 |
9 | 1001 | 1000 | 1000 |
function isPowerFor2(n) {
return n & (n-1);
}