简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15075 Accepted Submission(s): 5132
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
Recommend
JGShining | We have carefully selected several similar problems for you: 1230 1235 1228 1248 1256
Statistic | Submit | Discuss | Note
这道题 我竟无言以对。。
其实也就是模拟计算器。因为这里没有小括号 很简单。只需要判断当前运算符和下一个运算符的优先级
就行,分别用两个栈存贮数字和符号,我用的数组。
我就是因为一个数据不对 而且我也找不出来。。浪费了N多时间。
有几个注意的地方
1:如果输入的第一个数字是0 例如0 + 2 + 3应该输出5.00 而不是结束
2:如果输入的是0(空格)(换行)应该输出0.00(我错在了这里。。气死了)
3. 数字可能是两位及两位以上
最后换换输入方式 就对了。附上wa和ac的代码
ac:
#include <stdio.h> #include <string.h> int main() { char fuhao[100],str[205]; double num[100],sum; while(gets(str)&&strcmp(str,"0")!=0) { int len=strlen(str); int t=0,q=0; memset(num,0,sizeof(num)); memset(fuhao,0,sizeof(fuhao)); for(int i=0;i<len;i++) { if(str[i]>='0'&&str[i]<='9') { double temp=0; while(str[i]>='0'&&str[i]<='9') temp=temp*10+str[i]-'0',i++; num[q++]=temp; } if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') fuhao[t++]=str[i]; } memset(str,0,sizeof(str)); sum=num[0]; for(int i=1;i<q;i++) num[i-1]=num[i]; for(int i=0;i<t;i++) { if(fuhao[i]=='*') sum=sum*num[i]; else if(fuhao[i]=='/') sum=sum/num[i]; else if(fuhao[i]=='+') { if(fuhao[i+1]=='*'||fuhao[i+1]=='/'&&i+1<t) { double temp=num[i]; while((fuhao[i+1]=='*'||fuhao[i+1]=='/')&&i+1<t) { if(fuhao[i+1]=='*') temp=temp*num[i+1]; else temp=temp/num[i+1]; i++; } sum=sum+temp; } else sum=sum+num[i]; } else if(fuhao[i]=='-') { if(fuhao[i+1]=='*'||fuhao[i+1]=='/'&&i+1<t) { double temp=num[i]; while((fuhao[i+1]=='*'||fuhao[i+1]=='/')&&i+1<t) { if(fuhao[i+1]=='*') temp=temp*num[i+1]; else temp=temp/num[i+1]; i++; } sum=sum-temp; } else sum=sum-num[i]; } } printf("%.2lf\n",sum); } return 0; }
wa的,就是输入的地方不一样
#include <stdio.h> #include <string.h> int main() { char fuhao[200]; double num[200],sum; while(scanf("%lf",&sum)!=EOF) { char mark=getchar(); if(mark=='\n'&&sum==0) { printf("%.2lf\n",sum); continue; } memset(fuhao,0,sizeof(fuhao)); memset(num,0,sizeof(num)); int t=0; while(1) { scanf("%c",&fuhao[t]); scanf("%lf",&num[t]); mark=getchar(); if(mark=='\n') break; t++; } for(int i=0;i<=t;i++) { if(fuhao[i]=='*') sum=sum*num[i]; else if(fuhao[i]=='/') sum=sum/num[i]; else if(fuhao[i]=='+') { if(fuhao[i+1]=='*'||fuhao[i+1]=='/') { double temp=num[i]; while((fuhao[i+1]=='*'||fuhao[i+1]=='/')&&i+1<=t) { if(fuhao[i+1]=='*') temp=temp*num[i+1]; else temp=temp/num[i+1]; i++; } sum=sum+temp; } else sum=sum+num[i]; } else if(fuhao[i]=='-') { if(fuhao[i+1]=='*'||fuhao[i+1]=='/') { double temp=num[i]; while((fuhao[i+1]=='*'||fuhao[i+1]=='/')&&i+1<=t) { if(fuhao[i+1]=='*') temp=temp*num[i+1]; else temp=temp/num[i+1]; i++; } sum=sum-temp; } else sum=sum-num[i]; } } printf("%.2lf\n",sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。