简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11042 Accepted Submission(s): 3590
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
Source
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main()
{
char ch[2000],c[1000];
int a;
double num[1000];
while(gets(ch))
{
int k=0,j=0,i;
int flag=0,flag1=0;
int head=0,wear=0;
double zsum=0;
a=strlen(ch);
if(a==1&&ch[0]=='0')
break;
for(i=0;i<a;i++)
{
if(ch[i]>='0'&&ch[i]<='9'&&flag==0)
{
flag=1; //这里是记有多少个字符数字的,刚开始用head记录
head=i;
}
if(ch[i]>='0'&&ch[i]<='9')
{
wear=i; //这里是也是记录的,最后一个用wear;
if(ch[i+1]==' '||ch[i+1]=='\0')
{
int sum=0;
for(int p=head;p<=wear;p++)
{
ch[p]-=48;
sum=sum+ch[p]*pow(10,wear-p); //这里的pow是那个字符的10的几次方,加起来
}
num[k++]=sum;
flag=0;
}
}
if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/')
{
c[j++]=ch[i];
}
}
for(i=0;i<j;i++)
{
if(c[i]=='*'||c[i]=='/')
{
if(c[i]=='/')
{
num[i+1]=num[i]/num[i+1];
if(c[i-1]=='-') //例如4-5*6+3 那样5*6是得正整数,没有加前面的负号,所以就要就要加上负号
num[i+1]=-num[i+1];
num[i]=0;
}
else
{
num[i+1]=num[i]*num[i+1];
if(c[i-1]=='-') //例如4-5*6+3 那样5*6是得正整数,没有加前面的负号,所以就要就要加上负号
num[i+1]=-num[i+1];
num[i]=0;
}
}
}
for(i=0;i<j;i++)
{
if(c[i]=='-')
{
num[i]=num[i]-num[i+1];
num[i+1]=0;
}
}
for(i=0;i<k;i++)
{
zsum=zsum+num[i];
}
printf("%.2lf\n",zsum);
}
return 0;
}