用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...
說到加減乘除運算,只要學過乘法口訣的應該沒有不會算的吧。
什么一一得一,一二得二.。。。信手拈來,簡直不要太容易。
難一點的無非也就是這四種運算符號組合起來而已,但是如此簡單的運算對于計算機而言,真的不是一件輕松的活啊。
就運算速度上,計算機遠超你我。
就運算簡易程度而言,你我勝過計算機。
為什么這么說呢?
下面舉個栗子,求一個算式(也叫中綴表達式)結果:5+(6-3)*4+8/2=?
對于我們而言,這個算式輕松的得到答案是21。那么計算機,又是如何得出這個結果的呢?
談到這個問題,首先我們應該了解兩個知識:棧(stack)和后綴表達式。
什么是棧?
棧又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
可以這么理解棧:棧相當于一個沒有瓶蓋的空瓶子。向瓶子內放入東西叫做入棧,從瓶子里倒出東西叫做出棧。瓶底叫棧底,瓶口叫棧頂。雖然不是很恰當,但是這么理解還是可以的。
什么是后綴表達式?
后綴表達式也叫逆波蘭式。它是波蘭的邏輯學家盧卡西維奇(Lukasiewicz)發明的一種表示表達式的方法。這種表示方式把運算符寫在運算對象的后面,例如,把a+b寫成ab+,所以也稱為后綴式。這種表示法的優點是根據運算對象和算符的出現次序進行計算,不需要使用括號,也便于用械實現求值。對于表達式x:=(a+b)*(c+d),其后綴式為xab+cd+*:=。
計算機對上述運算表達式的過程大致分為兩個步驟:
將中綴表達式轉換為后綴表達式
通過執行后綴表達式得出結果
首先介紹轉換為后綴表達式的過程。轉換的過程中遵循一個規則(符號進棧,數字輸出):
從左到右遍歷中綴表達式的每個數字和符號
如果是數字就加入后綴表達式
如果是符號,判斷括號:如果是左括號“(”,直接入棧;是右括號“)”,則依次從棧中取出運算符加入后綴表達式中,直至取到“(”后停止,并且將棧中“(”刪除
如果是括號以外的其他運算符,判斷這個運算符和棧頂符號優先級:其優先級低于或者等于棧頂符號則先將棧中符號依次彈出加入后綴表達式后自身入棧,否則自身就直接入棧
直到遍歷中綴表達式結束,得到后綴表達式
詳細過程:
將5輸出,+進棧;目前輸出為5,棧中為+;
遇到(,進棧;目前輸出為5,棧底到棧頂依次為+(;
將6輸出,減號進棧,3輸出;目前輸出為56 3,棧底到棧頂依次為+(-;
遇到),去匹配(,棧頂符號出棧,直到(出棧;目前輸出為56 3-,棧中為+;
遇到乘號進棧,6輸出;目前輸出為56 3- 4,棧底到棧頂依次為+*;
遇到+,由于+的優先級比*低,所以棧中所有元素都出棧,自身進棧;目前輸出為56 3- 4* +,棧底到棧頂依次為+;
遇到10輸出,除號進棧;目前輸出為56 3- 4* +8,棧底到棧頂依次為+/;
遇到2輸出;目前輸出為56 3- 4*+8 2,棧底到棧頂依次為+/;
表達式結束,棧中全部依次出棧,最終為56 3- 4* +8 2/ +;
其次是后綴表達式的執行過程。其執行過程也遵循一個規則:
從左向右遍歷后綴表達式的每個數字和符號,
遇到是數字就進棧
遇到是符號,就將處于棧頂兩個數字出棧,三者進行運算得到的運算結果進棧,直到最后獲得運算結果
56 3依次進棧,然后遇到了減號;此時棧底到棧頂依次為56 3;
處于棧頂的3和6出棧,相減得到3,將3進棧;此時棧底到棧頂依次為53;
4進棧,然后遇到乘號;此時棧底到棧頂依次為53 4;
處于棧頂的4和3出棧,相乘得到12,將12進棧;此時棧底到棧頂依次為512;
遇到加號,處于棧頂的12和5出棧,加一下得到17,將17進棧;此時棧里只有一個17;
82依次進棧,然后遇到除號;此時棧底到棧頂依次為178 2;
處于棧頂的2和8出棧,相除得到4,將4進棧;此時棧底到棧頂依次為174;
遇到加號,處于棧頂的4和17出棧,想加得到21,將21進棧;
表達式結束,輸出結果21,棧變空。
看完感覺怎樣?
是不是很復雜?
其實還好吧,233。。。
有的小伙伴可能又要吐槽了,知道這些過程有個屁用,實際工作中會讓你寫這個過程么?
是的,工作可能不需要你了解底層如何計算,你需要告訴計算機這些數字和運算符,剩下的就等著拿到結果就ok。
我想說,編程重要的不是你能不能完成單純的開發任務,而是你能不能從任務中看到背后的編程思想。
思想決定高度!
思想有多遠,你就能走多遠~~~~~~~~
總結
以上是生活随笔為你收集整理的用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL:规范数据库设计
- 下一篇: Fasterrcnn代码个人精细解读(先