EOJ 2845.符号方程求解

题面

单点时限: 2.0 sec
内存限制: 256 MB

解一元一次方程,输出方程的解(精确至小数点后 3 位)。

例如,以下是几个一元一次方程的实例:
4 + 3 x = 8 4+3x=8 4+3x=8
6 a − 5 + 1 = 2 − 2 a 6a-5+1=2-2a 6a5+1=22a
− 5 + 12 y = 0 -5+12y=0 5+12y=0
+ a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a − a + 1098 = 123 − 1245 + 23712 − 1 − 1 − 0 − 20 +a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a+1098=123-1245+23712-1-1-0-20 +aaaaaaaaaaaaaaaaaaaaaa+1098=1231245+2371211020
− x − x − x − x − x − x − x − 101 = 2 -x-x-x-x-x-x-x-101=2 xxxxxxx101=2
y − 1 = 0 y-1=0 y1=0
1 = x 1=x 1=x
− 6 c − 5 c + 1 = 2 − 2 c -6c-5c+1=2-2c 6c5c+1=22c

在方程中,只包含整数、小写字母及+、-、= 三个符号(符号 - 既可作减号,也可作负号)。方程中没有括号,也没有除号,方程中的小写字母表示要求解的未知数。

输入保证一元一次方程均为合法的,且有唯一实数解。

输入格式
一行信息,是一个合法的一元一次方程。行的长度小于 80。

输出格式
一行信息,是方程的解。格式参考输出例子。

样例

i n p u t input input
6a-5+1=2-2a
o u t p u t output output
a=0.750

解题思路

解一元一次方程,就只要得到常数项的大小和未知数系数大小然后做除法。
在处理输入的方程的时候,就按照符号出现顺序来处理,用flag标记是在等号左边还是右边,注意等号两边的符号变化。约等于做一个移项。
这个多项式的处理方法就得记住一下,不然每次都硬推。

ac代码

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
using namespace std;

void get_data(string s,int &a,int &b,char &k)
{
	int ceof;
	int sign=1;
	int i=0;
	int flag=1;
	while(s[i])
	{
		ceof=0,sign=1;
		if(s[i]=='+')
		{
			sign=1;
			i++;
		}
		else if(s[i]=='-')
		{
			sign=-1;
			i++;
		}
		if(s[i]>='a'&&s[i]<='z')
		{
			k=s[i];
			ceof=1;
			i++;
			if(flag)
				a+=sign*ceof;
			else
				a-=sign*ceof;
			continue;
		}
		else if(s[i]>='0'&&s[i]<='9')
		{
			while(s[i]>='0'&&s[i]<='9')
			{
				ceof=ceof*10+s[i]-'0';
				i++;
			}
			if(s[i]>='a'&&s[i]<='z')
			{
				k=s[i];
				if(flag)
					a+=sign*ceof;
				else
					a-=sign*ceof;
				i++; 
			}
			else
			{
				if(flag)
					b-=sign*ceof;
				else
					b+=sign*ceof;
				continue;
			}
		}
		if(s[i]=='=')
		{
			flag=0;
			i++;
		}
	}
}

int main()
{
	string s;
	cin >> s;
	int ceof=0,cons=0;
	char c;
	get_data(s,ceof,cons,c);
	double res;
	res=(double)cons/(double)ceof;
	cout.precision(3);
	cout << c << "=" << fixed << res;
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值