MYOJ_4553:(洛谷P1022)[NOIP 2000 普及组] 计算器的改良(数学运算与求解相关)
题目描述
NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手 ZL 先生。
为了很好的完成这个任务,ZL 先生首先研究了一些一元一次方程的实例:
- 4+3x=8。
- 6a−5+1=2−2a。
- −5+12y=0。
ZL 先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及 +
、-
、=
这三个数学符号(当然,符号“-
”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入
一个一元一次方程。
输出
解方程的结果(精确至小数点后三位)。
样例输入输出
输入:6a-5+1=2-2a
输出:a=0.750
思路:
这个题有点绕,但很好做
STEP 1:声明方程字符串,变量名,系数和与常数和(合并同类项方便求解),符号,在方程的哪边
STEP 2:输入,遍历每个字符,开始处理。
STEP 3:如果是等号,就进入右边,重置符号为正
STEP 4:加号,符号为正;减号,符号为负
STEP 5:提取连续的数字字符转为整型
STEP 6:如果是系数项,现特判是否只有字母,此时说明系数=1,然后根据在式子的哪边调整,根据左右边调整符号并累加到变量系数总和
STEP 7:如果是常数项,根据左右边调整符号并累加到常数项总和
STEP 8:保存方程的结果(常数项和 / 变量系数和)
STEP 9:如果结果是-0.0,需要特判为0,不然洛谷的第5测试点不对
STEP 10:按要求输出
代码
#include<bits/stdc++.h> using namespace std; string s; char v; int c,t=0,n=1; bool l=true; int main() { cin>>s; for(int i=0;i<s.length();) { if(s[i]=='=') { l=false; n=1; i++; } else if(s[i]=='+') { n=1; i++; } else if(s[i]=='-') { n=-1; i++; } else { int num=0,j=i; bool var=false; while(j<s.length()&&isdigit(s[j])) { num=num*10+(s[j]-'0'); j++; } if(j<s.length()&&isalpha(s[j])) { v=s[j]; if(i==j) { num=1; } c+=l?n*num:-n*num; j++; } else { t+=l?-n*num:n*num; } i=j; } } double ans=(double)t/c; if(ans==-0.0) { ans=0; } printf("%c=%.3f",v,ans); return 0; }
运行结果