实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...
一直很糾結算法的文章應該怎么寫。最后覺得還是從最簡單的level開始寫吧,一開始就弄些重量級的,什么人工智能,機器學習的算法,還要有大量的數學以及優化的知識,小白們估計會很郁悶,當然我也不一定能做出來對吧。
我計劃每題給出兩種語言的解決方案,一種靜態語言,一種動態語言。
我選擇C語言,Python和Java作為實現語言,由于篇幅有限,其他語言的實現有興趣的朋友請自己嘗試。
LeetCode 371. 兩整數之和(Sum of Two Integers)
問題描述:
不使用運算符 + 和 - ???????,計算兩整數 ???????a 、b ???????之和。
示例:
C語言實現:
既然不讓用+和-,那么只能用位運算或者乘除和余來實現。
如果我們將兩個數轉換成二進制,則有 0+0=0,0+1=1,1+1=10,我們忽略掉進位的話就變成了0+0=0, 0+1=1, 1+1=0,這個時候我們完全可以把+替換成^。但是如何處理進位呢?
我們會發現只有1+1時才發生進位,即1&1才進位,但是進位是進到前面一位的,所以我們要將進位的1再左移一位。這個時候我們將上述得到的兩個新數再次執行異或,如果沒有進位的話,這將是最后我們要的結果,但是有可能還有進位。若還有進位的話,我們就要重復上面的步驟,一直到處理完所有的進位。最后的結果將是異或不會再次遇到進位問題,得到最終結果。
我們如何判斷異或不會遇到進位?根據兩個數&的結果,如果有進位,&的結果一定不等于0,所以&的結果可以作為判斷計算是否結束的條件。
下圖演示了26+13=39的步驟:
具體代碼如下:
python語言的實現:
python的實現和C語言的實現基本一致,但是注意python的整型長度是沒有限制的。我們需要限制在32位長度范圍內,所以我們要對位操作的結果再與0xffffffff來做限制。
此外最終的結果可能是大于32位最大正整數的(即0x7fffffff),而在python中大于這個數的值,仍然表示為正數,而我們期望它應該是一個負數,所以當最終的結果大于0x7fffffff的時候我們要對其取反,這樣既可得到相應的負數。
代碼如下:
Java語言的實現:
Java的實現和python語言的實現相同。
代碼如下:
總結
以上是生活随笔為你收集整理的实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 90帧游戏秒变120帧!iQOO Neo
- 下一篇: 薇娅就偷逃税致歉 称完全接受处罚:李佳琦