牛客網 劍指offer 不用加減乘除做加法

2021-09-11 05:47:21 字數 1130 閱讀 6831

題目描述:寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。

題目很簡單,但解決起來還是有一定難度的,說起代替加減乘除的方式,一下子能想起來的有sizeof,二進位制的位運算。

sizeof行不通之後,又琢磨位運算中的異或,1 ^ 1->0, 1 ^ 0->1, 0 ^ 1->1, 0 ^ 0->0。這個規則看起來最接近加法法則,但是缺乏進製,比如,我們如何區分1 ^ 1 和0 ^ 0帶來的結果呢,前者有進製而後者沒有,那麼如何給1 ^ 1 標誌出進製呢?

答案是&,按位與。只有1 & 1結果為1。我們又知道加法中進製的含義就是例如:16+15,6+5結果超過10,所以在前一位加1,結果為31。在二進位制中也是一樣,所以我們需要把代替進製的&運算結果先左移一位,再與異或運算的結果按位相加。

這裡你又會問:不是程式中不能出現加法運算嗎?那要怎麼實現進製(num1&num2)<<1和不含進製的和num1^num2的相加呢?

答案是使用遞迴或者迴圈結構。遞迴就是在函式體內再次呼叫此函式,迴圈就是將同樣的加法和進製程式寫入迴圈體內,多次執行。兩者的結束條件都是一樣的,想一想,什麼時候我們就不需要進行加法計算了呢?那就是在進製為0的時候,此時num1^num2就是最後的結果了。

遞迴程式如下:首先給carry和pre_sum賦初值,這兩步也是後續遞迴時不斷執行的操作。由於這個程式的本質還是要執行加法,所以最後返回的應該是pre_sum。

int

add(

int num1,

int num2)

return pre_sum;

}

另一種是迴圈:由此也可以看出遞迴和迴圈是如何等價的。遞迴語句之外的其他操作是會被重複執行的,而迴圈結構內的語句也是不斷執行的。

int

add(

int num1,

int num2)

return pre_sum;

}

int

add(

int num1,

int num2)

return num2;

}

其實還是很難懂的,這裡趁熱記下來,方便以後的複習和思維鍛鍊。

牛客網劍指offer第48題 不用加減乘除做加法

題目 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。思路 分析 實現兩個是相加不用四則運算,根據計算機中的運算不用四則運算那麼肯定是位運算了。以下分析來自劍指offer 比如我們計算5 17 22這個結果,世界上,我們可以分為3個步驟計算,第一步各位數相加不進製,此時的結果是12...

牛客 劍指offer系列題解 不用加減乘除做加法

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。1 問題描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。2 資料結構 位運算3 題解 方法1 coding utf 8 class solution def add self,...

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...