每日一道算法题:编程实现两个数的除法,当然不能用除法操作符

本文介绍了一种不使用除法操作符实现两数相除的方法。首先通过简单的循环减法得到结果,但效率较低。随后改进算法,利用乘数倍增的方式提高效率,实现了快速除法。

题目:编程实现两个数的除法,当然不能用除法操作符

// return  x/y
int div(const int x, const int y)
{
     ...
}
解题思路:开始想到的是通过比较x和y之间的大小来求出商,将除法看成减法来运算,判断x-y之后的值,代码如下:

int div(const int x, const int y){
    int result = 0;
    if (y < 0){
        cerr << "Error!" << endl;
        exit(1);
    }
    if (x < y){
        return 0;
    }
    int temp = x;
    while (temp >= y){
        temp -= y;
        ++ result;
    }
    return result;
}
但是当x值很大,y值很小时,代码就运行的非常慢了。以10000/3为例,每次都减去一个3,要做3333次减法才行;那试想每次减数都是上一次减数的2倍,10000-2048*3=3856,继续循环,最终10000=2048*3 + 1024*3 + 256*3 + 4*3 + 1*3 + 1,这样,将2的倍数转化为右移操作来实现,代码如下:

int div1(const int x, const int y){
    if (y == 0){
        cerr << "Error!" << endl;
        exit(1);
    }
    if (x < y){
        return 0;
    }
    int temp = x, result = 0;
    while (temp >= y){
        int mul = 1;
        while (y * mul <= (temp >> 1)){
            mul = mul << 1;
        }
        result += mul;
        temp -= y * mul;
    }
    return result;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值