• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            A Za, A Za, Fighting...

            堅信:勤能補拙

            不用+、-、×、÷數字運算符做加法

            題目來源:
            http://zhedahht.blog.163.com/blog/static/254111742011125100605/

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

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

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

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

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

            接下來我們試著把二進制上的加法用位運算來替代。第一步不考慮進位,對每一位相加。00 11的結果都00110的結果都是1。我們可以注意到,這和異或的結果是一樣的。對異或而言,0011異或的結果是0,而0110的異或結果是1。接著考慮第二步進位,對000110而言,都不會產生進位,只有11時,會向前產生一個進位。此時我們可以想象成是兩個數先做位與運算,然后再向左移動一位。只有兩個數都是1的時候,位與得到的結果是1,其余都是0。第三步把前兩個步驟的結果相加。如果我們定義一個函數AddWithoutArithmetic,第三步就相當于輸入前兩步驟的結果來遞歸調用自己。

            #include<stdio.h>

            int
            tricky_add(
            int arg1, int arg2)
            {
                
            int a, b;
                a 
            = arg1 ^ arg2; /* this is the result of arg1+arg2 without carry */
                b 
            = arg1 & arg2;
                b 
            <<= 1;

                
            if(b == 0)
                    
            return a;
                
            else
                    
            return tricky_add(a, b);
            }

            int
            main(
            int argc, char **argv)
            {
                
            int x, y;
                
            while(scanf("%d %d"&x, &y) != EOF) {
                    printf(
            "%d\n", tricky_add(x, y));
                }

                
            return 0;
            }



            posted on 2011-06-17 17:30 simplyzhao 閱讀(320) 評論(0)  編輯 收藏 引用 所屬分類: M_面試題集錦

            導航

            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产2020| 精品久久久久中文字| 中文字幕人妻色偷偷久久| 77777亚洲午夜久久多人| 久久久久亚洲精品无码蜜桃| 久久精品国产精品国产精品污| 久久久精品视频免费观看| 久久天天躁夜夜躁狠狠| 久久久久久综合一区中文字幕 | 日日躁夜夜躁狠狠久久AV| 99精品久久久久久久婷婷| 久久精品一区二区三区AV| 99久久亚洲综合精品成人| 日韩人妻无码一区二区三区久久99| 久久久久久毛片免费播放| 国产精品美女久久久免费| 久久夜色精品国产噜噜麻豆 | 亚洲va中文字幕无码久久| 99久久精品免费看国产一区二区三区| 久久精品中文字幕大胸| 91久久精品国产成人久久| 久久久久人妻一区精品性色av| 午夜精品久久久久久久无码| 久久久久国产精品| 久久精品国产一区| 青青青青久久精品国产h| 国产亚洲欧美精品久久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 亚洲精品高清一二区久久| 国产精品成人99久久久久| 久久久久久免费一区二区三区| 久久不见久久见免费视频7| 伊人久久无码中文字幕| 99久久无色码中文字幕人妻| 亚洲国产成人久久精品99| 久久无码人妻精品一区二区三区| 97精品伊人久久久大香线蕉| 青草影院天堂男人久久| 精品国产一区二区三区久久蜜臀| 青青草原综合久久| 久久久黄片|