标签:重置 cte ima divide view integer 组成原理 sed div
1 int divide(int dividend, int divisor) { 2 if(divisor==0)return INT_MAX; 3 if(dividend==0)return 0; 4 long long res=0; 5 int flag=1; 6 long long d1=dividend; 7 long long d2=divisor; 8 if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))flag=0; 9 if(d1<0)d1=-d1; 10 if(d2<0)d2=-d2; 11 if(d2>d1)return 0; 12 int i=0; 13 long long d3=d2; 14 while(d1>=d3){ 15 d2=d3; 16 i=0; 17 while(d1>=d2){ 18 d1=d1-d2; 19 if(d1>=0)res=res+(1<<i); 20 d2<<=1; 21 i++; 22 } 23 } 24 if(flag==0)res=0-res; 25 if(res<INT_MIN||res>INT_MAX)return INT_MAX; 26 return res; 27 }
学过计算机组成原理的都知道,在计算机内部是没有乘除的,计算机内部的算术运算只有加减,而加减又可以都当做是一种操作。计算机组成原理中介绍除法运算的时候会介绍一种较辗转相减的方法,就是将两个相除的数据取正,用大的那个循环减去小的那个,直到出现负值,并且没减一次,count++,最后的count就是结果。这种方法的局限性在与,每次都只减去一个除数,这样的话,循环的次数太多,浪费时间。我们要做的就是在每次减去除数的时候,都将它扩大一倍。举例来说:
a/b=?
a=100,b=2,count=0
第一次 a-=b b<<=1 (a=98,b=4,count+=1)
第二次 a-=b b<<=1 (a=94,b=8,count+=2)
第三次a-=b b<<=1 (a=78,b=16,count+=4)
...
...
第一次count只加1的原因是,只减去一个b
第二次count加2的原因是,减去了2个b
第三次,则是减去了4个b
特别注意的是上面的循环只是一次的循环,b每次扩大2倍,总会大于a,只要跳出循环,参数重置,再次进行循环知道a小于初始的b即可。
标签:重置 cte ima divide view integer 组成原理 sed div
原文地址:http://www.cnblogs.com/lichao-normal/p/6105518.html