主题:菜鸟求救:一元一次方程的疑问
几优.兄
[专家分:0] 发布于 2009-02-05 11:24:00
计算器的改良
[问题描述]
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12Y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及十、一、=这三个数学符号(当然,符号“一”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
[问题求解]
编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
[输入样例]
6a-5+1=2-2a
[输出样例]
a=0.750
帮我分析一下。谢谢。
回复列表 (共6个回复)
沙发
小田甜 [专家分:3910] 发布于 2009-02-09 11:47:00
首先提取那个小写字母,和它的系数。
注意,等号后面的全部要把系数乘以-1。
然后整理成ax=b的形式,最后x=b/a。
这个说起来容易,不过实现还是有些困难的。
简单的:
申请两个变量a, b,初值为0
提取方程的字母,用c记录。
先根据=,+,-把所有的项拆分出来,并随拆分随处理。
把拆分出来的项如样例的6a -5 +1 -2 --2a(等号后的要加-)带入一个过程。
过程中先记录并删除最后的字母,然后判断前面的符号+,-,--,-+等(用boolean的not判断-)。
最后用val把数字提取出来,并根据+-和有没有字母存到a,b之中
最后输出c,'=',a/b:0:3即可。
板凳
lixeb [专家分:80] 发布于 2009-02-22 19:25:00
假设方程存在(fc:string);且方程最后以'@'结尾,总之是理想条件!只包含整数、小写字母及+、-、=这三个数学符号
Function solveEquation(fc:string):real;
var cs,xs,result:real;{常数,系数,先用Real其他精度在说}
i,anew:integer;
ch,wzs:char;
numsign,zy:-1..1;{符号控制}
begin
i:=1;
numsign:=1;
zy:=1;
cs:=0;
xs:=0;
wzs:='';
anew:=0;
while(i<=length(fc))do
begin
ch:=fc[i];
case(ch)of
'0'..'9':begin anew:=anew*10+ord(ch); end;
'+':begin if(anew<>0)then cs:=cs+anew*numsign; numsign:=1*zy; anew:=0; end;
'-':begin if(anew<>0)then cs:=cs+anew*numsign; numsign:=-1*zy; anew:=0; end;
'=':begin if(anew<>0)then cs:=cs+anew*numsign; zy:=-1; numsign:=-1; anew:=0; end;
'@':begin if(anew<>0)then cs:=cs+anew; anew:=0; end;
'a'..'z':begin wzs:=ch; if(anew=0)then xs:=xs+1 else xs:=xs+anew; anew:=0; end;
end;
end;
result:=-cs/xs;{xs当然不能为0,这只能要球方程格式无误且符合题目要球}
writeln('方程',xs,wzs,'=',-cs,'的解为:'wzs,'=',result:1:3);
end;
3 楼
lixeb [专家分:80] 发布于 2009-02-22 19:27:00
忘了最后还得加上 solveEquation:=result;
4 楼
lixeb [专家分:80] 发布于 2009-02-22 19:45:00
严重失误 ch:=fc[i]; 后得加上 i:=i+1;
5 楼
lixeb [专家分:80] 发布于 2009-02-22 19:54:00
'a'..'z':begin wzs:=ch; if(anew=0)then xs:=xs+1 else xs:=xs+anew; anew:=0; end;
应改为:
'a'..'z':begin wzs:=ch; if(anew=0)then xs:=xs+1 else xs:=xs+anew*numsign; numsign:=zy; anew:=0; end;
'0'..'9':begin anew:=anew*10+ord(ch); end;
应改为:
'0'..'9':begin anew:=anew*10+ord(ch)-Ord('0'); end;
6 楼
lixeb [专家分:80] 发布于 2009-02-22 19:55:00
失误,我真不该一边解题还一边灌水!
我来回复