首页 > 代码库 > HDU 1237
HDU 1237
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13316 Accepted Submission(s): 4385
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
浙大计算机研究生复试上机考试-2006年
做了这道题我发现那些能编写计算器的人简直屌爆了。。
卡了我一天的题目,还只是简单的简算,还没用到任何函数,对数,根号运算。
上代码吧。我的思想就是用栈做。先将第一个数推进栈,然后不断的进栈,出栈,运算。
#include <stdio.h> #include <stack> #include <algorithm> using namespace std; int main() { double n,m; char c; while(~scanf("%lf",&n)) //首先输入一个数 { c=getchar(); // 从键盘上得到一个字符,可以使空格也可以使回车。 if(c=='\n' &&n==0) //如果N为0并且直接回车的话按题目说的结束程序。 break; stack<double>s; // 将double 类型的建立栈 s.push(n); // 将第一个数推进栈 scanf("%c",&c); // 开始输入一个字符 while(~scanf("%lf",&n)) //继续输入一个数 { if(c=='*') // 如果字符为乘号 { m=s.top();// 令m等于栈首元素(可理解为第一个数) m*=n;// m* n为它们的结果 s.pop();// 此时清空栈 s.push(m); // 将m推进栈。 } if(c=='/') { m=s.top(); m/=n; s.pop(); s.push(m);// 以上同上 } if(c=='+') s.push(n);// 直接推进栈 if(c=='-') s.push(0-n);// 直接推进栈 if(getchar()=='\n') break;// 一旦遇到回车直接跳出 c=getchar();// 反复输入符号 } double sum=0; while(!s.empty()) //如果有加号,或者减号,说明栈是不空的,因为有元素被推进去了 { sum+=s.top();// 不断的加上栈首元素。 s.pop(); //不断的弹栈,直到栈空为止。 } printf("%.2lf\n",sum);//sum的值即为整个表达式最终的值了。 } return 0; }
HDU 1237
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。