(笔试题)不用除法操作符,实现两个正整数的除法

题目:

如题所示

思路:

假设问题是a除以b:

题目要求是正整数,所以考虑的条件不是很多,如果要求是整数的话,即要考虑正负情况的判断。

1、最简单的就是依次用被除数a减去除数b,并统计减去的次数,即为相除结果;

这种方法效率不高,尤其是在被除数a很大,除数b很小的情况下,效率非常低;

2、考虑每次相减时,将b翻倍,这样就可以提高很大的效率;

3、考虑位运算,因为位运算一般都比较高效;

4、采用递归的方法;

代码:

注意:代码中没有考虑b=0的判断

#include <iostream>

using namespace std;

// naive method
int myDiv_0(unsigned int a,unsigned int b){
    int ans=0;
    while(a>=b){
        ans++;
        a=a-b;
    }
    return ans;
}

// more effective
int myDiv_1(unsigned int a,unsigned int b){
    unsigned int x,y;
    int ans=0;
    while(a>=b){
        x=b;
        y=1;
        while(a-x>=x){
            x+=x;
            y+=y;
        }
        a-=x;
        ans+=y;
    }
    return ans;
}

// bit shift, more effective
int myDiv_2(unsigned int a,unsigned int b){
    unsigned int x,y;
    int ans=0;
    while(a>=b){
        x=b;
        y=1;
        while(a>=(x<<1)){
            x<<=1;
            y<<=1;
        }
        a-=x;
        ans+=y;
    }
    return ans;
}

// recursive method
int myDiv_3(unsigned int a,unsigned int b){
    if(a<b)
        return 0;
    unsigned int x=b;
    unsigned int y=1;
    while(a>=(x<<1)){
        x<<=1;
        y<<=1;
    }
    return myDiv_3(a-x,b)+y;
}

int main()
{
    unsigned int a=100;
    unsigned int b=3;
    cout << myDiv_3(a,b) << endl;
    return 0;
}

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值