---恢复内容开始---
洛谷P1022 计算器的改良
题目背景
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。
题目描述
为了很好的完成这个任务,ZLZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZLZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入格式
一个一元一次方程。
输出格式
解方程的结果(精确至小数点后三位)。
输入输出样例
输入 #16a-5+1=2-2a输出 #1
a=0.750
#include<bits/stdc++.h> using namespace std; string sentence; int dl1,dl2,ta;//系数&常数项 int xs(int n,int t) { if(sentence[n]>='0'&&sentence[n]<='9') return xs(n+1,t*10+sentence[n]-'0'); ta=n; return t; } int main() { getline(cin,sentence); char x; int zf=1,w=0,t=-1,fh; while(sentence[++t]!='\0') { fh=1; if(sentence[t]=='=') { zf=-1; continue; } if(sentence[t]=='-') { fh=-1; t++; } if(sentence[t]>='a'&&sentence[t]<='z') { x=sentence[t]; dl1+=zf*fh; continue; } if(sentence[t]<='9'&&sentence[t]>='0') { int n=xs(t,0); t=ta; if(sentence[t]>='a'&&sentence[t]<='z') { dl1+=n*zf*fh; x=sentence[t]; } else { dl2+=n*zf*fh; t--; } } } cout<<x<<"="; //double会出现-0的情况! double ans= -dl2/(dl1*1.0); if(ans==-0.000) ans=0.000; printf("%.3lf",ans); return 0; }
solution
首先一次性读入这个式子
再逐个判断
遇到等号就把zf(正负)设为-1
(zf在循环前要设为1)
遇到减号/负号就把fh(符号)设为-1
(fh在每次循环开始时要初始化为1)
遇到数字就进入函数,返回这个数字串的实值
同时看下一位是不是字母,是的话就放到dl1(系数)里,否则放到dl2(常数项)里
最后移项(*-1)
系数化为一
double是有-0的!!!
这就是为什么总有一个点过不去,答案是0。000,一般程序则会输出-0.000
所以加一个特判
如果ans是-0.000,ans=0.000
The End
很重要!!!