计算机的改良【模拟】

>Description
最近实验室收到了一个任务:解一元一次方程。

为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:

4+3x=8

6a−5+1=2−2a

−5+12y=0

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。


>Input
一个一元一次方程。

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


>Sample Input
6a-5+1=2-2a

>Sample Output
a=0.750


>解题思路
一道模拟题。
把未知数移到等号左边,把剩下的移到方程的右边,分别记录下他们的系数即可。

需要注意的坑:

  1. -1a是以-a的方式呈现
  2. 在c++中,0除以一个负数得出来的是-0

>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;

ll x, y, l, s; //x记录等号左边的系数,y记录等号右边的系数
char c, a;
double ans;

int main()
{
	
	l = 0, s = 1; //l记录当前系数,s记录当前符号
	c = getchar();
	while (c != '=')
	{
		if (c == '-' || c == '+')
		{
			y -= l * s; //把它移过去符号要变
			if (c == '-')  l = 0, s = -1;
			if (c == '+')  l = 0, s = 1;
		}
		if (c >= '0' && c <= '9')  l = l * 10 + c - '0';
		if (c >= 'a' && c <= 'z')
		{
			if (l == 0) l = 1;
			a = c;
			x += l * s;
			l = 0, s = 1;
		}
		c = getchar();
	} 
	y -= l * s; //处理等号左边
	
	l = 0, s = 1;
	c = getchar();
	while (c != 10)
	{
		if (c == '-' || c == '+')
		{
			y += l * s;
			if (c == '-')  l = 0, s = -1;
			if (c == '+')  l = 0, s = 1;
		}
		if (c >= '0' && c <= '9')  l = l * 10 + c - '0';
		if (c >= 'a' && c <= 'z')
		{
			a = c;
			if (l == 0) l = 1;
			x -= l * s;
			l = 0, s = 1;
		}
		c = getchar();
	}
	y += l * s; //处理等号右边
	
	ans = (double) y / x;
	if (ans == -0.0) ans = 0;
	printf ("%c=%.3f", a, ans);
	return 0;
} 

你可能感兴趣的:(贪心;暴力;模拟)