快捷且常用的算法可以在做题时起到事半功倍的效果,建议记忆后使用。
不定时更新~
long pow_2(int b){
long x = 2;
//运算指数
long res = 1;
//运算结果
while(b>0) {
if(b&1) //转换成二进制后取最后一位
res *=x;
b >>= 1;//右移一位
x*=x;
}
return res;
}
幂运算的话当然可以放个for循环然后222*2···,但是如果对于比较大的数这样是比较耗费时间的,所以我们借用二进制来快速运算
指数运算有个特点为底数相同时,两数相乘等于指数相加,所以我们可以将一个数转换为二进制数后每一位分别乘上对应的次数.
举个例子
配上图的话大概可以理解了,每次右移一位后判断是否要乘起来,但是每次右移一位之后都要将2的次数加一,一直到最左边的一位。这样结果就出来了。
当然不是用二进制的话可以将参数传入时添加一个变量,将要运算的指数传入。
这个就不多说了,很常用的算法,采用辗转相除法。
int gcd(long a, long b){
if(b==0) return a;
return gcd(b, a%b);
//或者直接return b==0?a:gcd*b, a%b);
}
3.最小公倍数
最大公约数都有了最小公倍数肯定不能少啊
一种方法是求得最大公约数以后利用最大公约数求解
long lcm(long a, long b){
return a/gcd(a, b)*b;
//注意:之所以先除以最大公约数再相乘是为了减少溢出可能
}
另一种方法是使用更相减损数
long lcm(long a, long b){
if(a


