@geek-sjl
2018-10-22T03:57:18.000000Z
字数 1995
阅读 501
#include <cstdio>struct res{long long q;long long r;};struct res divide_t(long long divided,long long divisor){struct res zeroRes;zeroRes.q=0;zeroRes.r=0;if(divided==0) return zeroRes;struct res tmpRes_t=divide_t(divided>>1,divisor);tmpRes_t.q<<=1;tmpRes_t.r<<=1;if(divided&1) tmpRes_t.r++;if(tmpRes_t.r>=divisor){tmpRes_t.r-=divisor;tmpRes_t.q++;}return tmpRes_t;}int divide(long long divided,long long divisor){//if(divisor==0||(divided==INT_MIN&&divisor==-1)) return INT_MAX;bool isNegative=false;if(divided<0) {isNegative=!isNegative;divided=-divided;}if(divisor<0) {isNegative=!isNegative;divisor=-divisor;}struct res tmpRes_t=divide_t(divided,divisor);if(isNegative) return -tmpRes_t.q;else return tmpRes_t.q;}int main(){int divided,divisor;scanf("%d%d",÷d,&divisor);printf("%d\n",divide(divided,divisor));}
emmm...基本上就是照着slide的代码翻译一下。
说一下理解吧。
1. 关于递归的临界条件,除数为0就返回0..emmm没毛病。
2. 递归下一层的时候除数除于2,被除数不变,再把结果翻倍。这个也好理解,
看完代码有种感觉是:这都能得出结果?分析一下好像又没有哪里不对..颠覆常识了2333
还有一个,leetcode交的时候没有注意数据范围..abs后溢出了T.T
#include <cstdio>using namespace std;typedef long long LL;int divide(LL divided,LL divisor){//if(divisor==0||(divided==INT_MIN&&divisor==-1)) return INT_MAX;bool isNegative=false;if(divided<0) {isNegative=!isNegative;divided=-divided;}if(divisor<0) {isNegative=!isNegative;divisor=-divisor;}if(divided==0) return 0;LL q=0,r=0;LL tmpDivided=0;int count=0;int countAll=0;LL toCountBit=divided;//计算一共有多少位while(toCountBit>0){toCountBit>>=1;countAll++;}//printf("%d\n",countAll);while(tmpDivided<divided){tmpDivided<<=1;//因为要从最高位开始计算,所以要1<<(countAll-count-1)if((1<<(countAll-count-1))÷d){tmpDivided++;}q<<=1;r<<=1;if(tmpDivided&1) r++;if(r>=divisor){q++;r-=divisor;}count++;}if(isNegative) return -q;else return q;}int main(){int divided,divisor;scanf("%d%d",÷d,&divisor);printf("%d\n",divide(divided,divisor));}
改写的思路就是把自顶向下改成自底向上,emmmm..先从递归的临界条件开始,逐步往上推,思路是不变的。leetcode交了一下过了,应该没有问题(如果它的数据不水的话)。