位運算除法 frisbee

2021-07-09 22:57:37 字數 1071 閱讀 3932

#include 

#include

using namespace std;

//非遞迴演算法,防止溢位

int integer_div_function(unsigned int dividend, unsigned int divisor)

}if(dividend - c < divisor)

break;

res += 1 << (k - 1); //累積除數

dividend -= c >> 1;

}return res;

}//極簡單的main函式

int main() {

freopen("frisbee.in", "r", stdin) ;

freopen("frisbee.out", "w", stdout);

unsigned int a, b;

cin >> a >> b;

if (a==b) cout << 1 << endl;

else if (b==1) cout << a << endl;

else cout << integer_div_function(a, b)<

題目如下:

問題描述:

輸入p (0 <= p <= 2,000,000,000) 和 q(1 <= q <= 2,000,000,000) ,

輸出p除以q 並且 截尾(取整),不准用」div」命令.

輸入7 2

輸出3

說明:7/2=3.5  取整後得3

理解:

這個演算法的理解很簡單。首先,若設被除數與除數為a、b,則有c=a/b。進而,c*b=a。而這個程式的目的,就在於將c找出來。首先利用位運算,將b不斷乘二,直到b*(2^i)>=a,而c相應的也要提高2^i(i等於將b擴大二倍的次數)。這樣下去,首先快速找到乙個大的範圍,再逐步精細化,直到c被求出位置為止。當然,在輸入後的兩個if是乙個小的優化。這道題已經滿分通過。

位運算乘除法

1 無符號除法 i.定點除法 對於n位dividend和divisor 1 擴充為2n 1位,但是擴充方向不一致,被除數是 000.nd 而除數是 divisor 000.2 如果dividend divisor,則dividend divisor quotient置 1 然後divisor向右移動...

用位運算實現除法

複習一下 被除數 除數 商.餘數累減 最簡單的就是不斷地用被除數減去除數,直到被除數小於除數,此時減的次數就是商 加權累減 假設現在要計算a b,a為a位的二進位制數,b為b位的二進位制數 1 將b左移a b位,變成乙個a位的二進位制數b 與a的位數一樣 2 如果a大於等於b 則令a a b 商累加...

位運算實現乘除法

對於任何十進位制正整數 k 設其二進位制為 bn b2b1b0 其中 bi 為二進位制某位值,i 0,n 二進位制數 k b0 2 0 b1 2 1 b2 2 2 bn 2 n 故乘二有 k b0 2 1 b1 2 2 b2 2 3 bn 2 n 1 即左移一 k 00 2 0 b0 2 1 b1 ...