HDU - 1237简单计算器(输出问题)

博客介绍了如何解决HDU 1237简单计算器问题,涉及对含有加减乘除的非负整数表达式的计算。文章提到了在处理精度和输出格式时遇到的挑战,并提供了题解思路。虽然代码部分未精简,但博主通过调试解决了输出相关的问题。
摘要由CSDN通过智能技术生成

简单计算器 HDU - 1237

题目

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

Input

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

Output

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

Sample Input

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

Sample Output

3.00
13.36

题解

模拟乘除加减的简单问题,用stack记录乘除加减符号,在一个个带入,很水的题目,注意double精度问题,但是我还是debug了半天,主要是输出问题

cout << fixed << setprecision(2) << si.top() << endl;//WA
printf("%.2lf\n",si.top());//AC

这两个东西是哪里有区别的???哭。。。太菜了我

代码

呃呃呃,这个代码不重要的,都没精简过。。。

string s;
stack<double>si;
stack<char>sc;
int main() {
	speed;
	while (1) {
		getline(cin, s);
		while (!si.empty())si.pop();
		while (!sc.empty())sc.pop();
		if (s == "0")break;
		for (int i = 0; i < s.length(); i++) {
			double a = 0; int j;
			if (s[i] >= '0' && s[i] <= '9') {
				for (j = i; j < s.length(); j++) {
					if (s[j] >= '0' && s[j] <= '9') {
						a = a * 10 + s[j] - '0';
					}
					else break;
				}
				si.push(a);
				i = j;
			}
			else if (s[i] != ' ') {
				if (s[i] == '*') {
					double b = si.top();
					si.pop();
					for (j = i + 2; j < s.length(); j++) {
						if (s[j] >= '0' && s[j] <= '9') {
							a = a * 10 + s[j] - '0';
						}
						else break;
					}
					si.push(a *1.000 * b );
					i = j;
				}
				else if (s[i] == '/') {
					double b = si.top();
					si.pop();
					for (j = i + 2; j < s.length(); j++) {
						if (s[j] >= '0' && s[j] <= '9') {
							a = a * 10 + s[j] - '0';
						}
						else break;
					}
					si.push(b*1.000 / a);
					i = j;
				}
				else if (s[i] == '-') {
					for (j = i + 2; j < s.length(); j++) {
						if (s[j] >= '0' && s[j] <= '9') {
							a = a * 10 + s[j] - '0';
						}
						else break;
					}
					si.push(-a);
					i = j;
					sc.push('+');
				}
				else sc.push(s[i]);
			}
		}
		while (!sc.empty()) {
			char c = sc.top();
			sc.pop();
			double first, second;
			first = si.top();
			si.pop();
			second = si.top();
			si.pop();
			si.push(first + second);
		}
		printf("%.2lf\n",si.top());
		si.pop();
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值