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