(筆試題)不用除法操作符,實現兩個正整數的除法


題目:

如題所示

思路:

假設問題是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;
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM