C語言 解決不用+、-、×、÷數字運算子做加法的實現方法

來源:互聯網
上載者:User

題目:寫一個函數,求兩個整數的之和,要求在函數體內不得使用+、-、×、÷。
分析:
這又是一道考察發散思維的很有意思的題目。當我們習以為常的東西被限制使用的時候,如何突破常規去思考,就是解決這個問題的關鍵所在。

看到的這個題目,我的第一反應是傻眼了,四則運算都不能用,那還能用什麼啊?可是問題總是要解決的,只能開啟思路去思考各種可能性。首先我們可以分析人們是如何做十進位的加法的,比如是如何得出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,第三步就相當於輸入前兩步驟的結果來遞迴調用自己。
有了這些分析之後,就不難寫出如下的代碼了:複製代碼 代碼如下:int AddWithoutArithmetic(int num1, int num2)
{
if(num2 == 0)
return num1;
int sum = num1 ^ num2; //異或運算
int carry = (num1 & num2) << 1; //對0加0、0加1、1加0而言,都不會產生進位,只有1加1時,會向前產生一個進位。因此兩個數先做位與運算,然後再向左移動一位。
return AddWithoutArithmetic(sum, carry);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.