不用加減乘除實現兩個正整數的加法

2022-05-08 09:51:08 字數 1392 閱讀 7707

很常見的一道題,網上也有各種各樣的解法,備忘一下。

首先來看十進位制整數的加法,123 + 999,將其分為三步來運算:

(1)對每一位相加,不考慮進製。當有進製時,捨棄。如下:

123+   999

=   012  

(2)考慮進製的影響。觀察可發現,當個位相加有進製時,實際上少加了10,當百位有進製時,實際上少加了100,依次類推。因此,第二步操作我們得到因為沒考慮進製少加的數。當沒有進製時為0,當有進製時,捨棄個位,留下十位。比如5 + 6 = 11,捨棄個位,留下十位,為1,即 5 + 6 = 1。對每一位做如此操作:

123+   999

=   111

個位: 3 + 9 = 1  少加了10

十位: 2 + 9 = 1  少加了100

百位: 1 + 9 = 1  少加了1000

共少加了 1100,即 111 * 10 = 1110。因為是十進位制,所以將進製相加得到的數 111 * 10,即為由於忽略進製少加的數

(3)將第一步和第二步所得到的數相加:

012+ 1100

= 1112

得到最後的結果。

推廣到二進位制,逢2進1。舉例:15 + 11,轉化成二進位制就是:1111 + 1011,還是按照上面的三個步驟:

(1)每一位相加,不考慮進製:

1111

+   1011

=   0100

(2)考慮進製,算出少加的數

1111

+     1011

=     1011

對應到二進位制,從右到左:

第一位進製:少加了2

第二位進製:少加了4

第四位進製:少加了16

因為是二進位制,需要將 1011 * 2,對應到二進位制中,就是左移一位,變成 10110

(3)將第一步和第二步的數相加:

0100 = 4

10110 = 22

和為: 26

使用二進位制加法時:

0100

+    10110

=    11010

實際上,在上述過程中仍然有進製,繼續利用上面的方法。因此,利用二進位制實現加法實際上是個迴圈的過程。

用程式實現上述步驟:

第一步中,1 + 1 = 0, 0 + 0 = 0, 1 + 0 = 1, 0 + 1 = 1 ,實際上符合異或的操作(相同為0,不同為1)

第二步中,1 + 1 = 1, 0 + 0 = 0, 1 + 0 = 0, 0 + 1 = 0, 實際上符合與操作(只有都為1時才為1)

第三步就是對第一步和第二步的重複。

**如下:

while(cin >> n >>m)

cout

<< n <

}

view code

對兩個整數進行加 減 乘 除

include int add int a,int b int sub int a,int b int mul int a,int b int div int a,int b void result int p int a,int b 使用函式的指標p作為result函式的形參 main int i...

用位運算實現兩個整數的加減乘除

1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。在不同的位上加1,那就是從相應的位開始向左計算,右邊不變。下面還有乙個網上的思路...

用位運算實現兩個整數的加減乘除運算

位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。整數加法 int add int a,int b return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。在不同的位上加1,那就是從相應的位開始...