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