HDU1237简单计算器

简单计算器
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6400    Accepted Submission(s): 2030


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



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



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



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


Sample Output
3.00
13.36


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define _MAX 205
char s[_MAX];
double a[_MAX]; //存数字
char b[_MAX]; //存操作符号

int atoi(char c)
{
	return c - '0';
}
int main()
{
	int i, len, k, j;
	double result, temp;
	while(gets(s))
	{
		if(!strcmp(s, "0"))
			break;
		result = temp = 0;
		len = strlen(s);
		k = 0;
		for(i = 0; i < len; i++)
		{
			if(isdigit(s[i]))
			{
				
				temp = temp * 10 + atoi(s[i]);
				continue;
			}
			if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
			{
				a[k] = temp;
				temp = 0;
				b[k++] = s[i];
			}
		}
		a[k++] = temp;
		//现在这里处理
		for(i = 0; i < k - 1; i++)
		{
			if(b[i] == '*' || b[i] == '/')
			{
				if(b[i] == '*')
					a[i + 1] = a[i] * a[i + 1];
				else
					a[i + 1] = a[i] / a[i + 1];
				a[i] = -1;
			}
		}
		//这里有问题
		for(i = 0; i < k;)
		{
			if(a[i] == -1)
			{
				for(j = i; j < k - 1; j++)
					a[j] = a[j + 1];
				k--;
			}
			if(a[i] != -1)
				i++;
		}
		j = 0;
		result = a[j++];
		for(i = 0; j < k; i++)
		{
			if(b[i] == '+' || b[i] == '-')
			{
				if(b[i] == '+')
					result += a[j++];
				else
					result -= a[j++];
			}
		}
		printf("%.2lf\n", result);
	}
	return 0;
}

你可能感兴趣的:(HDU)