思考方式:刚开始无从下手,tag里的提示是binary search 也就是二分搜索,以前的二分搜索都是知道两端开始向中间靠拢。这里的二分搜索是向右方靠拢, 然后循环的地方在如果越界,就在最后的区间内寻找,可见这种二分搜索的效率是不如那种的。但是这依然是O(lgn)的算法,所以说还是有不错的运行效率的。
如图:
代码:
#include<iostream> using namespace std; int divide(int dividend, int divisor) { long long l = dividend; long long r = divisor; if (l == -2147483648&&r==-1){ return INT_MAX; } if (l == 0 || r == 0) return 0; int flag = 0; if ((l < 0 & r>0) || (l > 0 && r < 0)) flag = 1; long long a = abs(l); long long b = abs(r); if (b > a) return 0; long long final = 0; while (b <= a){ long long sum = b; int n = 1; while (sum+sum<= a){ sum = sum + sum; n += n; } final += n; a = a - sum; } if (flag) final = 0 - final; return final; } int main(){ cout << divide(15, 3) << endl; }