不用除号,计算除法运算。思路是使用减法运算!
思路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 }
View Code

 

posted on 2016-07-28 17:17  人生一世,草木一秋。  阅读(45)  评论(0编辑  收藏  举报