题面
单点时限: 2.0 sec
内存限制: 256 MB
解一元一次方程,输出方程的解(精确至小数点后 3 位)。
例如,以下是几个一元一次方程的实例:
在方程中,只包含整数、小写字母及+、-、= 三个符号(符号 - 既可作减号,也可作负号)。方程中没有括号,也没有除号,方程中的小写字母表示要求解的未知数。
输入保证一元一次方程均为合法的,且有唯一实数解。
输入格式
一行信息,是一个合法的一元一次方程。行的长度小于 80。
输出格式
一行信息,是方程的解。格式参考输出例子。
样例
6a-5+1=2-2a |
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;
}