1.向下整除 n // 2 等价于 右移一位 n >> 1;
取余数 n % 2等价于 判断二进制最右一位值 n & 1 ;
2.n / 10 :删除十进制最右边一位
n % 10:取十进制最右边一位
3.n & 1 : ==1表示n为奇数,
==0表示为偶数
4.经常遇到可能位溢出,比如快速幂运算,那么需要用long类型来接收结果值。
class Solution {
public:
int cuttingRope(int n) {
if(n <= 3) return n - 1;
int a = n / 3, b = n % 3, p = 1000000007;
long ret = 1, x = 3; //会溢出就用long扩大位数
//快速幂运算开始
for(int i = a - 1; i > 0; i >>= 1){ //每一次检查是否越界,检查 a - 1次,留下最后一次 <<=>> 3^(a-1)
if( i & 1 == 1) ret = (ret * x) % p;
x = (x * x) % p;
}
//结束
// 判断最后剩余的一段是 0、 1、 2
if(b == 0) return (ret * 3) % p;
if(b == 1) return (ret * 4) % p;
return (ret * 3 * 2) % p;
}
};