CSU 文本计算器
来源:互联网 发布:人工智能的利弊 作文 编辑:程序博客网 时间:2024/05/29 06:42
文本计算器
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 37 Solved: 12
[Submit][Status][Web Board]
Description
Bob讨厌复杂的数学运算.看到练习册上的算术题,Bob很是头痛.为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器.这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了.你能够帮助Bob吗?
Input
每个样例一行,输入一个长度小于1500的包含有'(',')','+','-','*','/',和'1'~'9'组成的四则运算表达式.对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.
Output
对于每一个例子,输出表达式的计算结果,精确到小数点后4位
Sample Input
3928*3180*3229+21372477*86381535+7452+3780+2061*280/3070/(7828-9348)
Sample Output
40333570297.000021396326.000012766.8763
模拟计算器计算
注意优先级 注意精度
#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <string.h>#include <string>#include <vector>#include <queue>#include <stack>#define MEM(a,x) memset(a,x,sizeof a)#define eps 1e-8#define MOD 10009#define MAXN 10010#define MAXM 100010#define INF 99999999#define ll __int64#define bug cout<<"here"<<endl#define fread freopen("ceshi.txt","r",stdin)#define fwrite freopen("out.txt","w",stdout)using namespace std;#define maxn 2000char buf[maxn];int length;stack<char> op;stack<double> n;int getPriority(char c){ switch(c) { case '(': return 1; case ')': return 1; case '+': return 2; case '-': return 2; case '*': return 3; case '/': return 3; default: return 0; }}double calc(double a,double b,char c){ double d; switch(c) { case '+': d=(a+b); break; case '-': d=(a-b); break; case '*': d=(a*b); break; case '/': d=(a/b); break; } return d;}void pull(){ double a,b; char c=op.top(); op.pop(); if(getPriority(c)>1 && n.size()>1){ b=n.top(); n.pop(); a=n.top(); n.pop(); n.push(calc(a,b,c)); }}int main(){// fread; while(scanf("%s",buf)!=EOF) { char c; double d; int i; length=strlen(buf); i=-1; while(++i<length) { if( buf[i]=='-' ){ // '-' 可能出现二义性(符号或减号)因此特殊处理 int flag=0; if(i==0) flag=1; else if(i>0){ int tmp=i; flag=1; while(tmp--){ if(isalnum(buf[tmp])){ flag=0; break; }else if(getPriority(buf[tmp])>1) break; } } if(flag){ sscanf(buf+i,"%lf",&d); n.push(d); while(isalnum(buf[i+1]) || '.'==buf[i+1]) i++; continue; } } if(isalnum(buf[i])){ //从左至右扫描表达式,数字读入 sscanf(buf+i,"%lf",&d); n.push(d); while(isalnum(buf[i+1]) || '.'==buf[i+1]) i++; }else{ //从左至右扫描表达式,运算符读入 c=buf[i]; if(getPriority(c)){ //能被识别的操作符 if('('==c || op.empty() || getPriority(c)>getPriority(op.top()) ) op.push(c); else if(')'==c){ //遇到有括号退栈计算,直到计算到左括号或栈空为止 while(!op.empty() && '('!=op.top()) pull(); if(!op.empty()) op.pop(); }else{ while(!op.empty() && getPriority(c)<=getPriority(op.top())) pull(); //操作符计算 op.push(c); } } } } while(!op.empty()) pull(); printf("%.4lf\n",n.top()); while(!n.empty()) n.pop(); //清空数据栈 } return 0;}
0 0
- CSU 文本计算器
- CSU 1655文本计算器
- 文本计算器
- 文本计算器
- CSU1655: 文本计算器
- 文本计算器 v4.1 是什么
- 文本计算器(加入异常处理)
- 表达式树 csu1655 文本计算器
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- CSU
- JSEE总结(一)——JNDI
- HDU 1690 Bus System (Floyed求最短路)
- ViewUtils模块的使用
- 使用 FileSystem JAVA API 对 HDFS 进行读、写、删除等操作
- 实现一个通讯录并将信息保存到文本中
- CSU 文本计算器
- 学习笔记一:TCP与UDP通信协议
- CreateFile 打开 I/O device
- 跟我学Java反射——三步曲
- 非UI线程加载图片
- FileSystem JAVA API 对 HDFS 进行读、写、删除等操作
- 的刚恢复规划风格和风格和符合规范化
- 【C++总结】函数模板
- Android中子线程和UI线程之间通信的方式(Handler与Thread-附源码)