简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15832 Accepted Submission(s): 5409
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
瞬间感觉自己好水啊,数据结构也学过了,到现在,连一个完整的表达式求值的题目都没ac过,后缀表达式也不知道怎么转化,连这个最简单的表达式求值,都一直错,最后改的不伦不类的ac 了,但是一点也没有所谓的成功感,只是感觉自己太水了,虽然每天都花费很长时间在敲代码,但是自己学的东西真的太少了,没有一点效率,至少省赛不应该是自己的目标,但是自己现在的水平就算明年省赛都可能是被新手虐的感觉,有点想崩溃,但是没有别的选择,只能坚持走下去,如果自己的不去努力,只能成为别人的垫脚石,努力会被别人虐,但是不努力会被更多人虐!加油吧!
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
double cul(double a,double b,char c)
{
switch (c)
{
case '+':return a+b;
case '-':return b-a;
case '*':return a*b;
case '/':return b/a;
}
}
void slove(char s[])
{
double num[1005];
char ope[1005];
int len=strlen(s);
int k=0,cnt=0;
for(int i=0;i<len;++i)
{
if(s[i]>='0'&&s[i]<='9')//数字直接入栈
{
double tp=0;
while(s[i]>='0'&&s[i]<='9')
{
tp=tp*10+s[i]-'0';
++i;
}
num[k++]=tp;
}
else
{
char op=s[i];i+=2;
double a=0;
while(s[i]>='0'&&s[i]<='9')//读取下一个数
{
a=a*10+s[i]-'0';
++i;
}
if(op=='*'||op=='/')
{
double b=num[--k];
num[k++]=cul(a,b,op);
}
else//把减号吸收到数字里,
{
if(op=='-')
{
a=-a;
}
num[k++]=a;
ope[cnt++]='+';
}
}
}
while(k>=0)
{
char op=ope[--cnt];
double a=num[--k],b=num[--k];
num[k++]=cul(a,b,op);
}
printf("%.2lf\n",num[0]);
}
int main()
{
char s[1005];
// freopen("shuju.txt","r",stdin);
while(gets(s),strcmp(s,"0")!=0)
{
slove(s);
}
return 0;
}
因为没有括号等特殊字符,可以用大神的方法直接这样做...
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
double num[1005]={0},tp;char op;
//freopen("shuju.txt","r",stdin);
while(scanf("%lf",&tp))
{
int cnt=0;num[0]=tp;
op=getchar();
if(op=='\n'&&tp==0)//注意
{
return 0;
}
while(1)
{
scanf("%c%lf",&op,&tp);
//cin>>op>>tp;
if(op=='*')//遇到乘除就运算
{
num[cnt]*=tp;
}
else if(op=='/')
{
num[cnt]/=tp;
}
else
{
if(op=='-')
{
tp=-tp;
}
num[++cnt]=tp;
}
if((op=getchar())=='\n')//控制结束
{
break;
}
}
for(int i=cnt;i>0;--i)//最后累加
{
num[i-1]+=num[i];
}
printf("%.2f\n",num[0]);
}
return 0;
}