hdu 1237 简单计算其

22 篇文章 0 订阅

Font Size:  

Problem Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36


//利用栈的原理来做,数字在一块,运算在一块。

不过不知道为什么G++不能Ac,而C++可以

源代码:

#include<stdio.h>
#include<string.h>
 int main()
 {
 	char ss[220];
 	int i,j;
 	int op_top;
 	int num_top;
 	int temp;
 	double sum;
 	char stack_op[220];
 	double stack_num[220];
 	while(gets(ss)&&!(strlen(ss)==1&&ss[0]=='0'))
 	 {
 	 	 op_top=num_top=0;
 	 	memset(stack_op,0,sizeof(stack_op));
		memset(stack_num,0,sizeof(stack_num));
		i=0;
		while(ss[i]!='\0')
		 {
		 	 if(ss[i]==' ')
		 	  {
		 	  	 i++;
		 	  	 continue;
		 	  }
		 	 if(ss[i]>='0'&&ss[i]<='9'&&!(stack_op[op_top]=='*'||stack_op[op_top]=='/'))
		 	   {
		 	   	  temp=0;
		 	   	  while(ss[i]>='0'&&ss[i]<='9')
		 	   	  {
		 	   	  	  temp=temp*10+ss[i]-'0';
		 	   	  	  i++;
		 	   	  }
		 	   	  stack_num[++num_top]=temp;
		 	   	  continue;
		 	   }
		 	 if(ss[i]>='0'&&ss[i]<='9'&&(stack_op[op_top]=='*'||stack_op[op_top]=='/'))
		       {
		       	   temp=0;
		 	   	  while(ss[i]>='0'&&ss[i]<='9')
		 	   	  {
		 	   	  	  temp=temp*10+ss[i]-'0';
		 	   	  	  i++;
		 	   	  }
		       	  if(stack_op[op_top]=='*')
		       	   {
		       	   	 stack_num[num_top]=1.0*stack_num[num_top]*temp;
		       	   	  op_top--;
					   continue;
		       	   }
		       	  if(stack_op[op_top]=='/')
		       	   {
		       	   	 stack_num[num_top]=(1.0*stack_num[num_top])/temp;
		       	   	 op_top--;
   		       	   	 continue;
		       	   }
		       	 op_top--;
		       	
		       }
		 	 if(ss[i]=='+'||ss[i]=='-'||ss[i]=='*'||ss[i]=='/')
		 	   {
		 	   	 stack_op[++op_top]=ss[i];
				 i++;
		 	   	 continue;
		 	   }
			
		 }
		 sum=0;
		    while(num_top>1)
		     {
		         if(stack_op[op_top]=='+')
				   {
				   	 sum+=(0+stack_num[num_top]);
				   }	 
				 if(stack_op[op_top]=='-')
				   {
				   	 sum+=(0-stack_num[num_top]);
				   }
				num_top--;
				op_top--;
		     }
		    if(stack_num[1]+sum==0)
		     printf("0\n");
		    else
 	 	     printf("%.2f\n",stack_num[1]+sum);
 	 }
 	 return 0;
 }


更简单的做法

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
    double num[300],t,sum;
    int i;
    char op;
    while(cin>>t)
    {
        memset(num,0,sizeof(num));
        num[0]=t;
        i=0;
        op=getchar();
        if(op=='\n'&&t==0)break;
        while(1)
        {
            cin>>op>>t;
            if(op=='*')num[i]*=t;
            else if(op=='/')num[i]/=t;
            else if(op=='+')num[++i]=t;
            else num[++i]=-t;
            if(getchar()=='\n')break;
        }
        for(sum=0;i>=0;i--)
            sum+=num[i];
        printf("%.2lf\n",sum);
    }
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值