九度OJ 题目1019:简单计算器
来源:互联网 发布:cad布局知乎 编辑:程序博客网 时间:2024/04/30 05:36
一题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
二.题目分析
刚开始看到此题时还有点胆怯,脑子中一下子跳出逆波兰式,各种数字栈,操作符栈等,仔细看一下,只有+ - * /四种运算,没有括号,因此可以采用简答模拟的方式,遇见高优先级的* /就先运算,最后对只有+ -的运算进行二次运算。
三.代码
1.
#include <stdio.h>#include <stdlib.h>#define MAX 210int Isdigit(char ch){ if('0'<=ch&&ch<='9') return 1; return 0;}int main(){ char str[MAX],temp[MAX],opstack[MAX]; int i,j,k1,k2; double numstack[MAX],x,t1,t2; while(gets(str)) { if(strlen(str)==1&&str[0]=='0') break; for(i=0,j=0;str[i]!='\0';i++) { if(str[i]!=' ') temp[j++]=str[i]; } temp[j]='\0'; k1=0;k2=0; for(i=0;i<j;) { if(Isdigit(temp[i])) //如果是数字,就如数字栈 { x=temp[i++]-'0'; while(Isdigit(temp[i])) //多位数字 { x*=10; x+=temp[i++]-'0'; } numstack[k1++]=x; //入栈 if(opstack[k2-1]=='*') //当上一个操作符是*,/时,由于具有较高优先级,则先计算出结果 { k1--; t1=numstack[k1]; t2=numstack[k1-1]; t1=t1*t2; numstack[k1-1]=t1; //更新数字栈中口结果 k2--; //操作符 * /出栈 } else if(opstack[k2-1]=='/') //同上 { k1--; t1=numstack[k1]; t2=numstack[k1-1]; t1=t2/t1; numstack[k1-1]=t1; k2--; } } else //如果是操作符,则入操作符栈 opstack[k2++]=temp[i++]; } //此时操作符栈中只有+ -,无优先顺序,按照从左到右顺序计算即可 x=numstack[0]; for(i=0;i<k2;i++) { if(opstack[i]=='+') x+=numstack[i+1]; else x-=numstack[i+1]; } printf("%.2f\n",x); } return 0;}
2.某不知名网友
#include <stdio.h> int main(void){ double data[200]; int top; double sum; char operator, blank; int dat; while (scanf ("%d%c", &dat, &blank) != EOF){ if ((dat == 0) && (blank != ' ')) break; data[0] = dat*1.0; top = 0; while (scanf ("%c %d%c", &operator, &dat, &blank) != EOF){ if (operator == '+') { ++top; data[top] = 1.0*dat; } if (operator == '-') { ++top; data[top] = -1.0*dat; } if (operator == '*') { data[top] *= dat; } if (operator == '/') { data[top] /= dat; } if (blank != ' ') break; } sum = 0.0; while (top >= 0){ sum += data[top]; --top; } printf ("%.2lf\n", sum); } return 0;}
0 0
- 九度oj 题目1019:简单计算器
- 九度OJ-题目1019:简单计算器
- 九度OJ 题目1019:简单计算器
- <九度 OJ>题目1019:简单计算器
- 九度OJ 题目1019:简单计算器
- 九度 OJ 题目1019:简单计算器
- 九度OJ-题目1019 简单计算器
- 九度OJ题目1019:简单计算器
- 题目1019:简单计算器 九度OJ
- 九度OJ—题目1019:简单计算器
- 九度OJ 1019 简单计算器
- 九度oj-1019:简单计算器
- 九度oj-1019-简单计算器
- 九度OJ 1019:简单计算器
- 九度OJ-1019-简单计算器
- 九度OJ-1019简单计算器
- 九度OJ 1019 简单计算器
- 【九度oj】1019简单计算器
- 创建一个动态链接库 (DLL),使用VS2010
- 关于升级Xcode版本后插件不能用的问题解决
- eclipse中装Java反编译器JD_GUI
- 树链剖分
- 我的加班费
- 九度OJ 题目1019:简单计算器
- CocoaPods pod install/pod update更新慢的问题
- 黑马程序员Java学习笔记之网络编程
- Ubuntu 如何安装ubuntu tools
- ERROR: opening port for MGR MGR (Connection refused).
- 实现和QQ退出聊天对话框的动画效果
- HDOJ-2001-计算两点间的距离
- 混合高斯模型(Mixtures of Gaussians)和EM算法
- 面试题集锦---BY算法导论小组