最开始时候开到这个题 不让用除法乘法和模运算 想到的就只剩下了位运算
位运算也就是左移乘2 右移除2 乘二除二 顺理成章的想到了二分查找
两个int的除法返回int 要摒弃传统除法的计算想法
a*b=c 转换为加法也就是b个a相加等于c 而整数除法中 b=c/a 则应该是b个a相加小于c 但是b+1个a相加大于c
由这个思路去找符合条件的b
首先想到的就是依次+1枚举 但是这样的做法就是超时
结果位运算我们可以每次加2的n次幂 当加多了的时候返回上一次加的结果 再次从2的零次幂开始加 直到找到符合条件的b 类似tcp拥塞控制的想法
以上就是这个题的思路
但是 这个题目一定要注意边界的溢出处理
int型变量很容易发生溢出 导致各种死循环的错误
因为为了防止溢出讲输入参数用一个长整形去代替
此处请注意 long long、long、和int类型的区别
long long 长度为8字节
long的长度则根据你的机器和编译器的不同而不同 比如我的机器是64位机器 但是编译器是32位的 那么sizeof(long)的返回值是4 若是64位的编译器应该返回8 经测试 leetcode的编译器应该是32位的 此处也导致了我卡住了几天找不到问题所在……
int的长度一般为4字节没得说 int的最值可以不用写2147483647 和-2147483648 可以写成INT_MAX和INT_MIN 他们在头文件<limits.h>中 当然宏定义展开后就是这两个数值