标签:ott 复试上机 lin ini print border blog 应用 个数
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年
Recommend
JGShining
思路:
因为乘除的优先级要高于加减的优先级,所以要先进行乘除的计算,每一个乘除计算的两个元素是前一个与后一个,其中,前一个数可能原始数据,也可能
是进行了乘除运算之后的结果(第一遍遍历我们只处理乘除)
可以用栈来模拟,没进行一次乘除运算就将结果取代栈顶元素
第二遍遍历的时候,处理加减运算
代码:
#include<bits/stdc++.h> using namespace std; const int MAXN=210; int num[MAXN]; char f[MAXN]; double s[MAXN]; char sg[MAXN]; int main() { string str; while(getline(cin,str)&&str!="0"){ stringstream stm(str); int i=1,j=0; int sum_num=0; stm>>num[0]; while(stm>>f[j]>>num[i]){ j++; i++; sum_num++; } int cou=0,cou2=0; double tmp=0; s[cou++]=num[0]; for(i=1,j=0;j<sum_num;i++,j++){ switch(f[j]){ case ‘+‘:s[cou++]=num[i];sg[cou2++]=f[j];break; case ‘-‘:s[cou++]=num[i];sg[cou2++]=f[j];break; case ‘*‘:tmp=s[--cou]*num[i];s[cou++]=tmp;break; case ‘/‘:tmp=s[--cou]/(num[i]*1.0);s[cou++]=tmp;break; } } double res=s[0]; for(i=1,j=0;j<cou2;j++,i++){ switch(sg[j]){ case ‘+‘:res+=s[i];break; case ‘-‘:res-=s[i];break; } } printf("%.2lf\n",res); //cout<<res<<endl; } }
标签:ott 复试上机 lin ini print border blog 应用 个数
原文地址:http://www.cnblogs.com/liuzhanshan/p/6294501.html