欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言 解決不用+、-、×、÷數(shù)字運算符做加法的實現(xiàn)方法

 更新時間:2013年05月24日 09:09:23   作者:  
本篇文章是對在C語言中解決不用+、-、×、÷數(shù)字運算符做加法的方法進行了詳細(xì)的分析介紹,需要的朋友參考下
題目:寫一個函數(shù),求兩個整數(shù)的之和,要求在函數(shù)體內(nèi)不得使用+、-、×、÷。
分析:
這又是一道考察發(fā)散思維的很有意思的題目。當(dāng)我們習(xí)以為常的東西被限制使用的時候,如何突破常規(guī)去思考,就是解決這個問題的關(guān)鍵所在。

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

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

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

接下來我們試著把二進制上的加法用位運算來替代。第一步不考慮進位,對每一位相加。0加0與 1加1的結(jié)果都0,0加1與1加0的結(jié)果都是1。我們可以注意到,這和異或的結(jié)果是一樣的。對異或而言,0和0、1和1異或的結(jié)果是0,而0和1、1和0的異或結(jié)果是1。接著考慮第二步進位,對0加0、0加1、1加0而言,都不會產(chǎn)生進位,只有1加1時,會向前產(chǎn)生一個進位。此時我們可以想象成是兩個數(shù)先做位與運算,然后再向左移動一位。只有兩個數(shù)都是1的時候,位與得到的結(jié)果是1,其余都是0。第三步把前兩個步驟的結(jié)果相加。如果我們定義一個函數(shù)AddWithoutArithmetic,第三步就相當(dāng)于輸入前兩步驟的結(jié)果來遞歸調(diào)用自己。
有了這些分析之后,就不難寫出如下的代碼了:
復(fù)制代碼 代碼如下:

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而言,都不會產(chǎn)生進位,只有1加1時,會向前產(chǎn)生一個進位。因此兩個數(shù)先做位與運算,然后再向左移動一位。
 return AddWithoutArithmetic(sum, carry);
}

相關(guān)文章

  • 詳解C++中的析構(gòu)函數(shù)

    詳解C++中的析構(gòu)函數(shù)

    這篇文章主要介紹了C++中的析構(gòu)函數(shù)的相關(guān)知識,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++?IO設(shè)備讀寫功能實現(xiàn)詳解

    C++?IO設(shè)備讀寫功能實現(xiàn)詳解

    C++的文件IO(Input,Output)操作就是指對文件進行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實現(xiàn)
    2022-11-11
  • C++實現(xiàn)簡單的計算器功能

    C++實現(xiàn)簡單的計算器功能

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單的計算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言的變量類型及內(nèi)存大小詳解

    C語言的變量類型及內(nèi)存大小詳解

    這篇文章主要介紹了CC和C++變量類型及內(nèi)存大小,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言模擬實現(xiàn)密碼輸入的示例代碼

    C語言模擬實現(xiàn)密碼輸入的示例代碼

    本文主要介紹了C語言模擬實現(xiàn)密碼輸入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c++引用傳參和指針傳參的區(qū)別及說明

    c++引用傳參和指針傳參的區(qū)別及說明

    這篇文章主要介紹了c++引用傳參和指針傳參的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C++性能剖析教程之循環(huán)展開

    C++性能剖析教程之循環(huán)展開

    這篇文章主要給大家介紹了關(guān)于C++性能剖析教程之循環(huán)展開的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C++中判斷成員函數(shù)是否重寫

    C++中判斷成員函數(shù)是否重寫

    這篇文章主要介紹了C++中判斷成員函數(shù)是否重寫的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組和指針的問題一道非常值得深思的筆試題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • linux之sort命令的用法

    linux之sort命令的用法

    sort將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出
    2013-10-10

最新評論