用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...
说到加减乘除运算,只要学过乘法口诀的应该没有不会算的吧。
什么一一得一,一二得二.。。。信手拈来,简直不要太容易。
难一点的无非也就是这四种运算符号组合起来而已,但是如此简单的运算对于计算机而言,真的不是一件轻松的活啊。
就运算速度上,计算机远超你我。
就运算简易程度而言,你我胜过计算机。
为什么这么说呢?
下面举个栗子,求一个算式(也叫中缀表达式)结果: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。
我想说,编程重要的不是你能不能完成单纯的开发任务,而是你能不能从任务中看到背后的编程思想。
思想决定高度!
思想有多远,你就能走多远~~~~~~~~
用计算机算加法与乘法应该怎么算,你知道计算机是怎么计算加减乘除算式的么?...相关推荐
- 计算机底层加法/乘法实现
计算机底层加法/乘法实现 存储方式 原理 加法 乘法 除法 代码实现 加法 乘法 存储方式 计算机底层中存放数字使用二进制形式,负数使用补码(反码+1)来存放. 原理 加法 两个二进制的相加结果是用一 ...
- 计算机用加法乘法实现除法运算的数学原理
数学原理:迭代序列 本篇只讨论加法乘法实现除法的数学原理,并不涉及数据结构. 设已知 c > 0 ,任取 数学归纳法我们有 0 < <1 , 0 < ...
- 计算机二进制小数加法,二进制是如何将加减乘除变换为加法实现的
二进制是如何将加减乘除变换为加法实现的?加法是如何由逻辑运算与.或.异或来实现的? 关注者 151 被浏览 10205 查看全部 13 个回答 匿名用户 5分钟教会你古中国人古埃及人和计算机如何用二进 ...
- 位运算符实现加法和乘法
文章目录 加法: 乘法: 问题1: 问题2: 加法: #include <iostream> using namespace std; int main() {int x, y;cin & ...
- javascript乘法和加法_js 大整数加法、乘法、除法
有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作.接下来我将演示大整数的加法 ...
- Additive secret sharing 加性秘密共享(加法,乘法,向量乘法)
目录 前言 Additive secret sharing Secure addition Secure multiplication Secure vectorization 前言 本文前一部分主要 ...
- java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 计算机公式求时间差公式,(EXCEL怎么算时间差?函数。)excle函数差怎么算
怎样在Excel上求差?求差的公式是?? 1鼠击结果的单元格: 2.用鼠标点击顶部输入的"=",输入栏会自动"=": 3.用鼠标点击被,输入栏会自动显示被减数单 ...
- c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...
最新文章
- KEGG功能注释工具 KofamKOALA 安装与使用
- 【深度学习入门到精通系列】R2 Unet解释
- 科研实习 | 约翰霍普金斯大学Alan Yuille教授招收计算机视觉暑期科研实习生
- 数据结构之动态规划问题
- 你应该知道的jQuery技巧【收藏】
- 怎么删除mysql的压缩包_压缩包版mysql怎么卸载
- 如何用计算机装手机系统,如何用手机usb重装电脑系统
- python自带的解释器叫做_21条python面试题,值得收藏!
- java内存模型作用是什么_什么是JVM内存模型?
- 自动化测试平台搭建从零开始
- vim怎么把一个写的代码文件另存到任意文件夹里?
- 3台机器配置hadoop集群_复制Hadoop集群之后无法访问端口50070的问题
- 应用密码学笔记第五章-第六章
- 学习笔记(02):Qt视频教程-基础实例进阶-网页爬虫-图片抓取
- CSS3 文字边框 -webkit-text-stroke 镂空的字体
- drain open 线与_Open-Drain与Push-Pull
- 阿里企业邮箱:密码登录
- 兆骑科创创客大赛,招商引资,招才引智,招企引税
- python 画ks曲线_Python绘制KS曲线的实现方法
- STM32学习心得二十六:DAC数模转换实验
热门文章
- 美国西北大学 计算机工程专业排名,2013年美国大学排名--USNEWS计算机工程专业排名...
- OCO-2卫星数据批量化下载教程
- N 个Android 视频教程免费下载
- Android Service详解
- 讯时网关部分话机无法注册问题
- c语言输出王字图形,专一的王子,C语言volatile关键字解析
- 暖暖CEO姚润昊:“公司80%都是女生,大多是踏实的90后”
- iMindMap邀您一起“约惠”开学季
- jspssh健身房会员卡信息管理系统
- Java中按字母顺序对字符串字符进行排序的4种不同方法