Calculate the sum of two integers a and b, but you are not allowed to use the Operator + and -. 計算兩個整數a和b的和,但不允許使用運算符+和 - 。
如果不能用加減運算,那還能有什么運算方法呢?當然了,還有親切的位運算。
和平時做加減法一樣,先各個位相加,然后得到的數再相加,注意:期間要考慮進位情況(有時候多次進位,比如:9999+1=10000)
二進制的兩個數相比較無非三種情況: 1———–1———–0 0———–1———–0 相加后結果: 1———–0———–0 不進位|||進位1|||不進位
a 00101 b +11100 A.先考慮1+0以及0+0不會進位的兩種情況,此時假使1+1=0(分開考慮是否進位兩種情況),則容易想到用亦或^(相同為零,不同為一)運算。設c=a^b,則: c.1 11001 B.其次考慮進位情況,1+1=10進一位,可以先使1+1=1后整個數字向左移動一位變為10,即"<<1",要使1+1=1,且0+0=0,且1+0或0+1=0的方法就是按位與&(全為一得一,其他全為零)運算。于是設d=(a&b)<<1,則: d.1 01000 //事情到這里就結束了嗎?我本來以為是的,喜洋洋的寫了個“return ((a&b)<<1)^(a^b)"就上交了,結果試了幾個數發現有對有錯了,想了下,哎呀,忘進位了,這家伙還是個循環哩。 于是就有了c.1+d.1的運算:重復上面的運算,這不挺像遞歸的嗎?讓我試試有啥需要注意的,遞歸總要做到參數對應吧。 c.2 10001 d.2 10000 c.3 00001 d.3 100000 這最后一次運算就要返回答案了 c.4 100001 d.4 00000 也就是說c對應a,d對應b,且結束的條件是b==0,于是就有了下面的代碼:當然了也可以用for循環來解答,當符合條件的時候跳出循環(break) 也可以是while。。。
以后做題還是要細心啊
新聞熱點
疑難解答
圖片精選