1023: 简单计算器
时间限制: 1 Sec 内存限制: 128 MB题目描述
Roliygu曾经沉迷于SICP大半个学期,在沉迷期间,他对LISP语言的算术表达式很感兴趣,于是类比写出了一种后缀表达式。后缀表达式是指的将两个操作数之间的操作符移到两个操作数之后的表达式。比如原来的表达式为(1-2)*(4+5)=-9,写成后缀表达式就成了 1 2 - 4 5 + *
输入
第一行输入n,0<n<10,表示有n行表达式
接下来的n行,每行一个后缀表达式,保证表达式合法,且不使用除四则运算之外的操作。不会输入负数
输出
输出n行,每行为输入表达式的最终结果,结果保留两位小数,不需要高精度数。
样例输入
1
1 2 - 4 5 + *
样例输出
-9.00
提示
来源
分析:一开始没看清题目,以为只计算一位数之间的运算,后来改了程序,注意了小数的输入计算和多位数输入的计算。
CODE:
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string.h>
using namespace std;
int main()
{
int n;
char c;
cin>>n;
c=getchar();
while(n--){
double arr[1005];
memset(arr,0,sizeof(arr));
int i=0;
while((c=getchar())!=EOF&&c!='\n'){
if(c>='0'&&c<='9'){
double tmp=0;
int eps=1;
bool flag=false;
while(c!=' '){
if(flag)
eps*=10;
if(c=='.')
flag=true;
else
tmp=tmp*10+c-'0';
c=getchar();
}
arr[i++]=tmp/eps;
}
else if(c!=' '){
i--;
// cout<<arr[i]<<' '<<arr[i-1]<<endl;
if(c=='+')
arr[i-1]+=arr[i];
else if(c=='-')
arr[i-1]-=arr[i];
else if(c=='*')
arr[i-1]*=arr[i];
else if(c=='/')
arr[i-1]/=arr[i];
}
}
cout<<setprecision(2)<<fixed<<arr[0]<<endl;
}
return 0;
}