不用除号,计算除法运算。思路是使用减法运算!
思路1:循环采用减法每次减去n,直到做完减法之后结果小于0为止 但是这样次数较大
如求100/3,需要次数为34次。
思路2:循环采用减法每次减去k,K的值每次会增加2倍,也就是左移1位,这样来优化思路1的算法
如求100/3,需要次数为3*2^i == 100时候的i的值,i=5时 3*2^6=96,i=6时 3*2^6=128,再计算4中几个3即可
k = 3*2^0 sum = 1<<0;
= 3*2^1 sum = 1<<2;
. .
. .
= 3*2^5 sum = 1<<5;
= 3*2^6 sum !=1<<6; //因为3*2^6 == 128,这是边界值,3*2^5 < 100 < 3*2^6.100-3*2^5=4 > 3,故需要计算100-96中有多少个3
贴出思路2的代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 //计算 a/b 的值. 4 int div(int a, int b){ 5 int m,n,k,i,sum,tmp; 6 //计算 m / n 的结果 7 m = a; 8 n = b; 9 10 k = n; 11 sum = 0;//最后结果 12 i = 0;//循环变量 13 //边界值判断 14 if(a < 0 || a < b) 15 return 0; 16 17 while(m >= k){ 18 sum = 1<<i; 19 tmp = k;//记录扩大前的因子,供边界调试时候使用 20 k = k<<1;//因子不断的以2的倍数扩大 21 i++; 22 } 23 //比如100/4时,i=4时,k=64,sum=16;i=5时,k=128,此时100<128,需要再计算(100-64)中含有几个4,即下面的递推公式 24 sum += div(m-tmp,b);//边界值计算 25 return sum; 26 } 27 int main(int argc, char *argv[]){ 28 29 int m,n,k,i,sum,tmp; 30 //计算 m / n 的结果 31 m = atoi(argv[1]); 32 n = atoi(argv[2]); 33 sum = div(m, n); 34 printf("减法%d/%d=%d\n",m,n,sum); 35 return 0; 36 }