題目:
如題所示
思路:
假設問題是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; }