洛谷P1022(计算器的改良)

题目背景

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。

题目描述

为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入格式

一个一元一次方程。

输出格式

解方程的结果(精确至小数点后三位)。

解题思路

  这题是在我写P1021的过程中顺手做的,但还是WA了一次,有两个坑,一个坑是编程中0*(-1)=-0,但是输出结果必须为0,还有一个就是有的未知数前面是没有系数的。注意这两点就可以轻松过。
Talking is cheap,show you my code.

代码

#include<iostream>
#include<string>
#include <iomanip>
using namespace std;
string str;
double k = 0;
double b = 0;
bool flag = 0;
bool ysf = 0;
char name;
int main() {
	cin >> str;
	int size = str.size();
	int t = 0;
	for (int i = 0;i < size;i++) {
		char c = str[i];
		if (c == '+') {
			ysf = 0;
		}
		else {
			if (c == '-') {
				ysf = 1;
			}
			else {
				if (c == '=') {
					flag = 1;
					ysf = 0;
				}
				else {
					if (c >= 'a'&&c <= 'z') {
						name = c;
						if ((i == 0) || (str[i - 1] < '0') || (str[i - 1] > '9')) {
							k++;
						}
					}
					else {
						if (c >= '0'&&c <= '9') {
							t *= 10;
							int it = c - '0';
							t += it;
							if (((i + 1) == size) || (str[i + 1] == '+') || (str[i + 1] == '-') || (str[i + 1] == '=')) {
								if (ysf == flag) {
									b += t;
									t = 0;
								}
								else {
									b -= t;
									t = 0;
								}
							}
							else {
								if (str[i + 1] >= 'a'&&str[i + 1] <= 'z') {
									if (ysf == flag) {
										k += t;
										t = 0;
									}
									else {
										k -= t;
										t = 0;
									}
								}
							}
						}
					}
				}
			}
		}
	}
	double ans = b / k;
	if (ans) {
		ans *= -1;
	}
	cout << name << "=" <<setprecision(3) << fixed << ans << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值