不用 數字運算子做加法

2021-08-26 11:17:13 字數 1076 閱讀 2441

題目:寫乙個函式,求兩個整數的之和,要求在函式體內不得使用+、-、×、÷。

分析:這又是一道考察發散思維的很有意思的題目。當我們習以為常的東西被限制使用的時候,如何突破常規去思考,就是解決這個問題的關鍵所在。

看到的這個題目,我的第一反應是傻眼了,四則運算都不能用,那還能用什麼啊?可是問題總是要解決的,只能開啟思路去思考各種可能性。首先我們可以分析人們是如何做十進位制的加法的,比如是如何得出5+17=22這個結果的。實際上,我們可以分成三步的:第一步只做各位相加不進製,此時相加的結果是12(個位數5和7相加不要進製是2,十位數0和1相加結果是1);第二步做進製,5+7中有進製,進製的值是10;第三步把前面兩個結果加起來,12+10的結果是22,剛好5+17=22。

前面我們就在想,求兩數之和四則運算都不能用,那還能用什麼啊?對呀,還能用什麼呢?對數字做運算,除了四則運算之外,也就只剩下位運算了。位運算是針對二進位制的,我們也就以二進位制再來分析一下前面的三步走策略對二進位制是不是也管用。

5的二進位制是101,17的二進位制10001。還是試著把計算分成三步:第一步各位相加但不計進製,得到的結果是10100(最後一位兩個數都是1,相加的結果是二進位制的10。這一步不計進製,因此結果仍然是0);第二步記下進製。在這個例子中只在最後一位相加時產生乙個進製,結果是二進位制的10;第三步把前兩步的結果相加,得到的結果是10110,正好是22。由此可見三步走的策略對二進位制也是管用的。

接下來我們試著把二進位製上的加法用位運算來替代。第一步不考慮進製,對每一位相加。0加0與1加1的結果都0,0加1與1加0的結果都是1。我們可以注意到,這和異或的結果是一樣的。對異或而言,0和0、1和1異或的結果是0,而0和1、1和0的異或結果是1。接著考慮第二步進製,對0加0、0加1、1加0而言,都不會產生進製,只有1加1時,會向前產生乙個進製。此時我們可以想象成是兩個數先做位與運算,然後再向左移動一位。只有兩個數都是1的時候,位與得到的結果是1,其餘都是0。第三步把前兩個步驟的結果相加。如果我們定義乙個函式addwithoutarithmetic,第三步就相當於輸入前兩步驟的結果來遞迴呼叫自己。

有了這些分析之後,就不難寫出如下的**了:

intaddwithoutarithmetic(

intnum1,

intnum2)

不用 數字運算子做加法

看到這個的題目第乙個反應就是位運算,但是想不通怎麼進行位運算,看了後面才知道,博主舉了個例子就是5 17 不進製,算出5 17 12,如下圖,就是小學生的運算,下面的1就是進製 這樣最後12 十位的1就是22 同樣,二進位制也可以,5的二進位制是101,17是10001,運算方法 10001 10 ...

CI20 1 不用運算子做加法

實現乙個函式求兩個數的和。不可以用 或其他運算符號。思路 直觀的思路是通過位運算來做加法。第一步 先不考慮進製,將兩個數通過異或可以求得對應位的和 第二步 考慮進製,將兩個數通過與運算可以求得哪些位有進製,然後將該結果左移一位,再和第一步中的結果進行異或,一直迭代制導進製的結果為0。include ...

刷題演算法 不用 運算子求加法

題目來自於lintcode 第1題 a b問題 題目如下 給出兩個整數a和b,求他們的和,但不能使用 等數 算符。一般數值進行加法,比如兩個數,a 9,b 7。當進行十進位制加法的時候,1.先算各個位數,2.然後得到進製,3.最終將進製加上前一位。由於不用加運算子,只能從位運算進行入手。由於我的自動...